OIDC协议

OIDC协议1 IDToken 是 jwt 包含一组关于身份认证会话的声明 claim 2 accesstoken 在 oidc 中也能使用 伴随着 idtoken 一起被发送到客户端 但是这不是必要的 因为 idtoken 已经包含了用户信息 accesstoken 只是为了和 OAuth 兼容 3 oidc 新增了用户端点 可以获取用户的个人信息 4 oidc 规定客户端可以简单的发现授权服务器的所有端点主要

1.ID Token是jwt,包含一组关于身份认证会话的声明(claim)

2.access token在oidc中也能使用,伴随着id token一起被发送到客户端,但是这不是必要的,因为id token已经包含了用户信息,access token只是为了和OAuth兼容。

3.oidc新增了用户端点,可以获取用户的个人信息

4.oidc规定客户端可以简单的发现授权服务器的所有端点

主要术语

EU:一个人类用户

RP:Relying Party,依赖放,只受信任的客户端

OP:OpenID Provider,有能力提供EU身份认证的服务,授权服务器

ID Token:jwt数据,包含EU身份认证的信息

UserInfo Endpoint:用户信息接口。当用户使用access token访问时,返回用户信息。

ID Token

包含了一组的Claims和其他辅助的公共的Claims


Authorization Code

认证过程

1.客户端准备好认证的必要参数,scope(必须包含openid),response_type,client_id,redirect_uri,state这5个必选参数。其他可选参数:response_mode,nonce,display。。。

2.客户端向授权服务器发起请求

3.授权服务器鉴定这个终端用户

4.授权服务器获得这个终端用户的授权信息

5.授权服务器给客户端一个授权码

6.客户端的用这个授权码请求授权服务器的token端点

7.客户端收到授权服务的响应,包含了ID Toekn和Access Token

8.客户端校验ID Token并获得该用户的个人信息

认证端点

认证请求

在授权端点,授权服务器必须同时支持GET和POST。当客户端使用GET时,参数以查询字符串的形式给出,当使用POST时,参数以表单形式提交。

Scope:必须的。其中必须包含openid

response_type:必须的。当使用的是Authorization Code时,该值为code

client_id:必须的。客户端标识

redirect_uri:必须的。重定向地址

state:推荐的。自己定一个值,用于防止跨站请求伪造

还要其他参数

认证请求验证

授权服务器必须对认证请求进行验证

1.授权服务器必须根据OAuth2.0验证所有的参数

2.确保scope里面包含了openid

3.确保所有需要的参数都存在

4.If the sub (subject) Claim is requested with a specific value for the ID Token, the Authorization Server MUST only send a positive response if the End-User identified by that sub value has an active session with the Authorization Server or has been Authenticated as a result of the request. The Authorization Server MUST NOT reply with an ID Token or Access Token for a different user, even if they have an active session with the Authorization Server. Such a request can be made either using an id_token_hint parameter or by requesting a specific Claim Value as described in Section 5.5.1, if the claims parameter is supported by the implementation.

授权服务器认证终端用户

授权服务器需要验证终端用户是否被授权

授权服务器必须与用户进行交互

1.终端用户没有被验证

2.在参数中带了prompt参数

在下列情况下,授权服务器不得与终端用户进行交互:

身份验证请求包含prompt参数,其值为none。在这种情况下,如果终端用户尚未通过身份验证或无法进行静默身份验证,则授权服务器必须返回一个错误。

授权服务器获得这个终端用户的授权信息

一旦对最终用户进行了身份验证,授权服务器必须在向依赖方发布信息之前获得授权决策。当所使用的请求参数允许时,可以通过与终端用户进行交互对话,明确表示同意的内容,或者通过处理请求的条件或其他方法(例如,通过以前的管理同意)建立连接

成功的认证响应

认证成功之后,会重定向到redirect_uri,并返回code和state(如果有的话)

错误的认证响应

error:必须的。错误代码

error_description:错误描述

error_uri:错误的uri

认证响应校验

客户端在收到服务端的认证响应之后,必须进行校验

Token 端点

Token请求

客户端向token 端点发起一个请求。

grant_type:authorization_code

code:获取的code码

redirect_uri=必须和前一次一样

必须使用POST请求和表单提交

Token请求验证

如果颁发了客户端凭据或使用了其他客户端身份验证方法,则对客户端进行身份验证

确保将授权码颁发给经过身份验证的客户端

确保授权码是有效的

验证以前没有使用授权码

确保2次的redirect_uri是一样的

验证使用的授权代码是为了响应OpenID Connect身份验证请求而发出的(以便从令牌端点返回ID令牌)。

成功的Token响应

在验证成功之后,返回ID Token和Access Token

响应使用application/json类型。

token_type必须是Bearer

错误的Token响应

返回application/json类型。

返回http 400

Token响应校验

客户端必须对IDToken和Access Token进行校验

注意:OIDC声明的只有Code,Implicit,Hybrid模式,而Password和Credentials都是OAuth2.0定义的,这两个可以说根本就没有用户认证这一说。


UserInfo Endpoint

userinfo端点存储着用户循序,需要用access token来获取

UserInfo请求

可以使用GET或者POST。必须使用Bearer Token

一般建议使用GET。

Authorization:Bearer xxxxx

成功的UserInfo响应

返回json对象

错误的UserInfo响应

返回http 401

客户端校验UserInfo响应

使用Scope来请求Claims的值

scope=openid profile email phone

使用Claims来请求Claims的值

把claims的值构造成一个json,

 { "userinfo": { "given_name": {"essential": true}, "nickname": null, "email": {"essential": true}, "email_verified": {"essential": true}, "picture": null, "http://example.info/claims/groups": null }, "id_token": { "auth_time": {"essential": true}, "acr": {"values": ["urn:mace:incommon:iap:silver"] } } }

刷新令牌

必须使用POST的表单来提交。服务端必须验refresh token。

验证成功,会返回一个新的refresh token和access token

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177220.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午8:01
下一篇 2026年3月26日 下午8:01


相关推荐

  • CentOS下yum的安装及配置

    CentOS下yum的安装及配置一般公司都用Linux来搭建服务器,Linux安装软件时能够用yum安装依赖包是一件非常简单而幸福的事情,因为你只需一个简单的安装命令yuminstall[]即可安装相应的软件,yum工具会自动的从网上yum源中下载相应的依赖包,并以正确的依赖关系一个个安装依赖包。下面简单介绍一下CentOS下安装yum源的流程和操作。一、查看、卸载已安装的yum包1、查看已安装的yum包

    2022年6月3日
    97
  • DSL是什么?

    DSL是什么?DSL 是目前世界上发展最快的高速宽带互联网接入技术 其全称是 DigitalSubsc 数字用户环路 它的历史要追溯到 1988 年 贝尔实验室一位工程师设计了一种方法可以让数字信号加载到电话线路未使用频段 这就实现了不影响话音服务的前提下在普通电话线上提供数据通信 但是贝尔的管理层对这个并不热心 因为如果用户安装两条线路会带来更多的利润 这一状况直到 1990 年代晚期有线

    2026年3月18日
    2
  • REST风格URI

    REST风格URI定义 REST 是一个标准 一种规范 遵循 REST 风格可以使开发的接口通用 便于调用者理解接口的作用 规则 GET 用来获取资源 查 POST 用来新建资源 增 PUT 用来更新资源 改 DELETE 用来删除资源 删对比 http localhost 8080 myweb getDogs gt GET rest api dogs 获取所有小狗狗 http localhost 8080 myweb addDogs gt POST rest ap

    2025年12月13日
    6
  • PHP怎么调用其他类的方法

    PHP怎么调用其他类的方法

    2021年10月25日
    49
  • AI寫程式神器Cursor是什麼?超全上手指南,自己開發頁面程式

    AI寫程式神器Cursor是什麼?超全上手指南,自己開發頁面程式

    2026年3月15日
    1
  • java arraylist数组初始化,ArrayList初始化 – Java那些事儿

    java arraylist数组初始化,ArrayList初始化 – Java那些事儿ArrayList 部分一共五篇文章了 并且引入了时间复杂度来分析 强烈建议大家一定要按顺序阅读 本文是第 1 篇 前些天的文章 反复的画图 不停的重复 就是想让大家理解 对象在内存中是什么样的 也是为今天的及以后的讲解打下基础 如果要说大家在写 Java 代码的时候哪个类用得最多 我想除了 String 基本上就是 ArrayList 了吧 那今天我们说说 ArrayList 首先 ArrayList 是一个普通的类

    2026年3月19日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号