授权码授予

class oauthlib.oauth2.AuthorizationCodeGrant(request_validator=None, **kwargs)[源代码]

Authorization Code Grant

授权码授权类型用于获取访问令牌和刷新令牌,并针对机密客户端进行了优化。由于这是基于重定向的流,因此客户端必须能够与资源所有者的用户代理(通常是Web浏览器)交互,并且能够从授权服务器接收传入请求(通过重定向):

+----------+
| Resource |
|   Owner  |
|          |
+----------+
     ^
     |
    (B)
+----|-----+          Client Identifier      +---------------+
|         -+----(A)-- & Redirection URI ---->|               |
|  User-   |                                 | Authorization |
|  Agent  -+----(B)-- User authenticates --->|     Server    |
|          |                                 |               |
|         -+----(C)-- Authorization Code ---<|               |
+-|----|---+                                 +---------------+
  |    |                                         ^      v
 (A)  (C)                                        |      |
  |    |                                         |      |
  ^    v                                         |      |
+---------+                                      |      |
|         |>---(D)-- Authorization Code ---------'      |
|  Client |          & Redirection URI                  |
|         |                                             |
|         |<---(E)----- Access Token -------------------'
+---------+       (w/ Optional Refresh Token)

注意:说明步骤(A)、(B)和(C)的行在它们通过用户代理时被分成两部分。

图3:授权码流

图3所示的流程包括以下步骤:

  1. 客户端通过将资源所有者的用户代理定向到授权端点来启动流。客户端包括其客户端标识符、请求的作用域、本地状态和重定向URI,一旦允许(或拒绝)访问,授权服务器将把用户代理发送回该重定向URI。

  2. 授权服务器(通过用户代理)对资源所有者进行身份验证,并确定资源所有者是同意还是拒绝客户端的访问请求。

  3. 假设资源所有者授予访问权限,则授权服务器使用先前(在请求中或在客户端注册期间)提供的重定向URI将用户代理重定向回客户端。重定向URI包括授权码和客户端先前提供的任何本地状态。

  4. 客户端通过包括在上一步中接收到的授权码,从授权服务器的令牌端点请求访问令牌。发出请求时,客户端向授权服务器进行身份验证。客户端包含用于获取用于验证的授权码的重定向URI。

  5. 授权服务器对客户端进行认证,验证授权码,并确保在步骤(C)中接收的重定向URI与用于重定向客户端的URI匹配。如果有效,授权服务器将使用访问令牌和可选的刷新令牌进行响应。

使用授权码授权的OAuth 2.0公共客户端容易受到授权码拦截攻击。

一种通过使用代码交换证明密钥(PKCE,发音为“Pixy”)来缓解威胁的技术已在当前oauthlib实现中实现。

add_token(token, token_handler, request)
参数:
  • token --

  • token_handler -- 令牌处理程序实例,例如oauthlib.oauth2.BearerToken类型。

  • request (oauthlib.common.Request) -- OAuthlib请求。

create_authorization_code(request)[源代码]

生成表示为字典的授权授予。

参数:

request (oauthlib.common.Request) -- OAuthlib请求。

create_authorization_response(request, token_handler)[源代码]

客户端通过使用“app/x-www-form-urlencode”格式将以下参数添加到授权端点URI的查询组件来构造请求URI Appendix B

response_type

必填。对于标准OAuth2授权流,值必须设置为“code”。对于OpenID Connect,它必须是“code Token”、“code id_Token”或“code Token id_Token”中的一个--我们实质上测试的是“code”出现在Response_type中。

client_id

必填。中所述的客户端标识符 Section 2.2

redirect_uri

可选。如中所述 Section 3.1.2

作用域

可选。访问请求的范围,如 Section 3.3

状态

推荐的。客户端用来维护请求和回调之间的状态的不透明值。授权服务器在将用户代理重定向回客户端时包括此值。该参数应用于防止跨站点请求伪造,如中所述 Section 10.12

客户端使用HTTP重定向响应或通过用户代理可用的其他方式将资源所有者定向到构造的URI。

参数:
  • request (oauthlib.common.Request) -- OAuthlib请求。

  • token_handler -- 令牌处理程序实例,例如oauthlib.oauth2.BearerToken类型。

返回:

标题、正文、状态

加薪:

重定向URI或客户端ID无效时出现FatalClientError。

以下是几个例子:

>>> from your_validator import your_validator
>>> request = Request('https://example.com/authorize?client_id=valid'
...                   '&redirect_uri=http%3A%2F%2Fclient.com%2F')
>>> from oauthlib.common import Request
>>> from oauthlib.oauth2 import AuthorizationCodeGrant, BearerToken
>>> token = BearerToken(your_validator)
>>> grant = AuthorizationCodeGrant(your_validator)
>>> request.scopes = ['authorized', 'in', 'some', 'form']
>>> grant.create_authorization_response(request, token)
(u'http://client.com/?error=invalid_request&error_description=Missing+response_type+parameter.', None, None, 400)
>>> request = Request('https://example.com/authorize?client_id=valid'
...                   '&redirect_uri=http%3A%2F%2Fclient.com%2F'
...                   '&response_type=code')
>>> request.scopes = ['authorized', 'in', 'some', 'form']
>>> grant.create_authorization_response(request, token)
(u'http://client.com/?code=u3F05aEObJuP2k7DordviIgW5wl52N', None, None, 200)
>>> # If the client id or redirect uri fails validation
>>> grant.create_authorization_response(request, token)
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "oauthlib/oauth2/rfc6749/grant_types.py", line 515, in create_authorization_response
        >>> grant.create_authorization_response(request, token)
    File "oauthlib/oauth2/rfc6749/grant_types.py", line 591, in validate_authorization_request
oauthlib.oauth2.rfc6749.errors.InvalidClientIdError
create_token_response(request, token_handler)[源代码]

验证授权码。

客户不得多次使用授权码。如果一个授权码被多次使用,授权服务器必须拒绝该请求,并且应该(在可能的情况下)撤销之前基于该授权码颁发的所有令牌。授权码与客户端标识符和重定向URI绑定。

参数:
  • request (oauthlib.common.Request) -- OAuthlib请求。

  • token_handler -- 令牌处理程序实例,例如oauthlib.oauth2.BearerToken类型。

prepare_authorization_response(request, token, headers, body, status)

根据响应模式放置令牌。

基类可以为其授权响应定义默认响应模式,方法是重写 default_response_mode 成员。

参数:
  • request (oauthlib.common.Request) -- OAuthlib请求。

  • token --

  • headers --

  • body --

  • status --

validate_authorization_request(request)[源代码]

检查授权请求中是否有正常错误和致命错误。

正常错误可能是缺少RESPONSE_TYPE参数,或者客户端试图访问不允许其请求授权的范围。正常错误可以安全地包含在重定向URI中并发送回客户端。

当客户端ID或重定向URI无效或缺失时,会出现致命错误。这些问题必须由提供程序捕获并处理,这超出了OAuthLib的范围,但显示一个描述该问题的错误页面是一个好主意。

参数:

request (oauthlib.common.Request) -- OAuthlib请求。

validate_grant_type(request)
参数:

request (oauthlib.common.Request) -- OAuthlib请求。

validate_scopes(request)
参数:

request (oauthlib.common.Request) -- OAuthlib请求。

validate_token_request(request)[源代码]
参数:

request (oauthlib.common.Request) -- OAuthlib请求。