创建提供程序
1.创建OIDC提供者
如果您没有OAuth2.0提供程序,可以按照 OAuth2.0 Creating a Provider 。然后,执行下面的迁移步骤。
2.将您的OAuth2.0提供商迁移到OIDC提供商
如果您正在运行OAuth2.0提供程序,并且希望升级到OIDC,您可以通过替换一行代码来升级它:
from oauthlib.oauth2 import Server
from oauthlib.oauth2 import RequestValidator
变成
from oauthlib.openid import Server
from oauthlib.openid import RequestValidator
然后,您必须实现新的 RequestValidator 方法如下所示。另请注意,一个新的 UserInfo endpoint 可以定义,并且需要一个新的控制器到您的网络服务器中。
3.扩展RequestValidator
如果您希望支持OpenID Connect,则必须在您的验证器子类中实现几个方法:
- class oauthlib.openid.RequestValidator[源代码]
- finalize_id_token(id_token, token, token_handler, request)[源代码]
最终确定OpenID连接ID令牌并签名或加密。
在OpenID Connect工作流中,当请求ID令牌时,会调用此方法。子类应该实现ID令牌的构造、签名和可选加密,如OpenID Connect规范中所述。
这个 id_token 参数是一个包含两个与规范相关的OIDC技术字段的字典。预填充的属性包括:
aud ,等于 request.client_id 。
iat 等于当前时间。
nonce 如果存在,则等于 nonce 从授权请求中删除。
at_hash 、散列值 access_token ,如果相关的话。
c_hash 、散列值 code ,如果相关的话。
此方法必须提供必填字段,如下所示:
iss ,必填。颁发者响应的颁发者的标识符。
sub ,必填。主题标识符
exp ,必填。使用OP执行身份验证时,RP不能接受ID令牌的过期时间。
必须添加其他报销申请,请注意 request.scope 应用于确定索赔清单。
欲了解更多信息,请访问 OpenID Connect Core#Claims
- 参数:
id_token -- 包含ID_TOKEN技术字段的词典
token -- 不记名代币词典
token_handler -- 令牌处理程序(BearerToken类)
request (oauthlib.common.Request) -- OAuthlib请求。
- 返回:
ID令牌(JWS签名的JWT或JWE加密的JWT)
- get_authorization_code_nonce(client_id, code, redirect_uri, request)[源代码]
从保存的授权码中提取现时值。
如果存在于身份验证请求中,则授权服务器必须在ID令牌中包括一个随机数声明,该声明值是在身份验证请求中发送的随机数值。授权服务器不应对使用的随机数值执行任何其他处理。随机数值是区分大小写的字符串。
只有代码参数应该足以从您正在使用的任何存储中检索授予代码。然而, client_id 和 redirect_uri 已经过验证,也可以使用。
- 参数:
client_id -- Unicode客户端标识符
code -- Unicode授权码授权
redirect_uri -- Unicode绝对URI
- 返回:
Unicode随机数
- 方法由以下人员使用:
授权令牌授权调度程序
- get_authorization_code_scopes(client_id, code, redirect_uri, request)[源代码]
从保存的授权码中提取作用域。
此方法返回的作用域用于根据传递给授权码请求的作用域来路由令牌请求。
这样,令牌端点就知道何时根据授权码范围在令牌响应中包含OpenIDConnect id_Token。
只有代码参数应该足以从您正在使用的任何存储中检索授权代码, client_id 和 redirect_uri 可以具有空值 "" 如果使用的是数据库,在SELECT查询中使用这些值之前,不要忘记检查它。
- 参数:
client_id -- Unicode客户端标识符
code -- Unicode授权码授权
redirect_uri -- Unicode绝对URI
- 返回:
范围一览表
- 方法由以下人员使用:
授权令牌授权调度程序
- get_id_token(token, token_handler, request)[源代码]
获取OpenID连接ID令牌
此方法是可选的,不推荐使用。 finalize_id_token 应该改为实施。但是,如果您想要完全控制 id_token ,您可能想要覆盖 get_id_token 与其使用 finalize_id_token 。
在OpenID Connect工作流中,当请求ID令牌时,会调用此方法。子类应该实现ID令牌的构造、签名和可选加密,如OpenID Connect规范中所述。
除了标准的OAuth2请求属性外,该请求还可能包含以下对此方法有用的OIDC特定属性:
随机数,如果工作流是隐式的或混合的,并且已提供
声明,如果提供给原始授权码请求
TOKEN参数是一个字典,它可能包含
access_token
条目,在这种情况下,生成的ID令牌 should 包括计算出at_hash
认领。同样,当请求参数具有
code
属性已定义,ID令牌 should 包括计算出c_hash
认领。http://openid.net/specs/openid-connect-core-1_0.html (sections 3.1.3.6 , 3.2.2.10 , 3.3.2.11 )
- 参数:
token -- 不记名代币词典
token_handler -- 令牌处理程序(BearerToken类)
request (oauthlib.common.Request) -- OAuthlib请求。
- 返回:
ID令牌(JWS签名的JWT)
- get_jwt_bearer_token(token, token_handler, request)[源代码]
获取JWT承载令牌或OpenID连接ID令牌
如果使用OpenID Connect,则应调用 oauthlib.oauth2.RequestValidator.get_id_token
- 参数:
token -- 不记名代币词典
token_handler -- 令牌处理程序(BearerToken类)
request (oauthlib.common.Request) -- OAuthlib请求。
- 返回:
JWT承载令牌或OpenID连接ID令牌(JWS签名的JWT)
- 方法由JWT承载和OpenID连接令牌使用:
JWTToken.create_token
- get_userinfo_claims(request)[源代码]
以JSON或签名或加密的形式返回UserInfo声明。
- UserInfo声明必须作为JSON对象的成员返回
除非在客户注册期间请求签名或加密的响应。第5.1节中定义的索赔可以退回,也可以退回未在该节中指定的其他索赔。
出于隐私原因,OpenID提供商可能会选择不返回某些请求的声明的值。
如果没有返回声明,则应该从表示声明的JSON对象中省略该声明名称;它不应该以空字符串值或空字符串值出现。
子(主题)声明必须始终在UserInfo响应中返回。
收到UserInfo请求后,UserInfo终结点必须返回UserInfo响应的JSON序列化,如HTTP响应正文中的13.3节所示,除非在注册期间指定了不同的格式 [OpenID.Registration] 。
如果UserInfo响应经过签名和/或加密,则声明在JWT中返回,并且内容类型必须为APPLICATION/JWT。响应可以被加密,而不需要也被签名。如果同时请求签名和加密,则必须对响应进行签名,然后进行加密,结果是嵌套的JWT,如中所定义 [JWT] 。
如果签名,UserInfo响应应包含作为成员的索赔ISS(颁发者)和AUD(受众)。ISS值应为OP的颁发者标识符URL。AUD值应为或包括RP的客户端ID值。
- 参数:
request (oauthlib.common.Request) -- OAuthlib请求。
- 返回类型:
Claims as a dict OR JWT/JWS/JWE as a string
- 方法由以下人员使用:
UserInfoEndpoint
- refresh_id_token(request)[源代码]
是否应刷新ID令牌。Default,True
- 参数:
request (oauthlib.common.Request) -- OAuthlib请求。
- 返回类型:
True or False
- 方法由以下人员使用:
RefreshTokenGrant
- validate_id_token(token, scopes, request)[源代码]
确保ID令牌有效并且有权访问作用域。
- OpenID CONNECT CORE 1.0描述如何验证id_Token:
- 参数:
token -- Unicode承载令牌
scopes -- 作用域列表(由您定义)
request (oauthlib.common.Request) -- OAuthlib请求。
- 返回类型:
True or False
- 方法被所有核心OpenID CONNECT JWT令牌颁发授权类型间接使用:
授权码授予
隐含赠与
混合赠款
- validate_jwt_bearer_token(token, scopes, request)[源代码]
确保JWT承载令牌或OpenID连接ID令牌是对作用域的有效和授权访问。
如果使用OpenID Connect,则应调用 oauthlib.oauth2.RequestValidator.get_id_token
如果不使用OpenID Connect,则可以 return None 以避免5xx而不是401/3响应。
- OpenID CONNECT CORE 1.0描述如何验证id_Token:
- 参数:
token -- Unicode承载令牌
scopes -- 作用域列表(由您定义)
request (oauthlib.common.Request) -- OAuthlib请求。
- 返回类型:
True or False
- 方法被所有核心OpenID CONNECT JWT令牌颁发授权类型间接使用:
授权码授予
隐含赠与
混合赠款
- validate_silent_authorization(request)[源代码]
确保登录用户已授权无人值守的OpenID授权。
静默OpenID授权允许向客户端授予访问令牌和ID令牌,而无需任何用户提示或交互。
- 参数:
request (oauthlib.common.Request) -- OAuthlib请求。
- 返回类型:
True or False
- 方法由以下人员使用:
OpenIDConnectAuthCode
OpenIDConnectImplicit
OpenIDConnectHybrid
- validate_silent_login(request)[源代码]
确保会话用户已授权静默OpenID登录。
如果没有用户登录或未授权静默登录,则此方法应返回FALSE。
如果用户已登录,但与多个帐户相关联,并且没有选择将哪个帐户链接到令牌,则此方法应引发oauthlib.oauth2.AccountSelectionRequired错误。
- 参数:
request (oauthlib.common.Request) -- OAuthlib请求。
- 返回类型:
True or False
- 方法由以下人员使用:
OpenIDConnectAuthCode
OpenIDConnectImplicit
OpenIDConnectHybrid
- validate_user_match(id_token_hint, scopes, claims, request)[源代码]
确保客户端提供的用户ID提示与会话用户匹配。
如果提供了子声明或id_Token_hint,则会话用户必须与给定的ID匹配。
- 参数:
id_token_hint -- 用户标识符串。
scopes -- OAuth 2作用域和OpenID声明列表(字符串)。
claims -- OpenID Connect索赔判决。
request (oauthlib.common.Request) -- OAuthlib请求。
- 返回类型:
True or False
- 方法由以下人员使用:
OpenIDConnectAuthCode
OpenIDConnectImplicit
OpenIDConnectHybrid