WebApplicationClient

class oauthlib.oauth2.WebApplicationClient(client_id, code=None, **kwargs)[源代码]

使用授权码授予工作流的客户端。

Web应用程序是在Web服务器上运行的机密客户端。资源所有者通过在资源所有者使用的设备上的用户代理中呈现的HTML用户界面来访问客户端。客户端凭证以及颁发给客户端的任何访问令牌存储在Web服务器上,并且不向资源所有者公开或由资源所有者访问。

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

parse_request_uri_response(uri, state=None)[源代码]

解析URI查询中的代码和状态。

如果资源所有者批准了访问请求,授权服务器将发布授权码并将其传递给客户端,方法是将以下参数添加到重定向URI的查询组件中,格式为“app/x-www-form-urlencode”:

参数:
  • uri -- 用户从提供程序重定向到您(即客户端)时产生的回调URI。

  • state -- 授权请求中提供的状态。

code

授权服务器生成的授权码。授权码必须在发布后不久过期,以减轻泄漏风险。建议授权码的最长寿命为10分钟。客户不得多次使用授权码。如果一个授权码被多次使用,授权服务器必须拒绝该请求,并且应该(在可能的情况下)撤销之前基于该授权码颁发的所有令牌。授权码与客户端标识符和重定向URI绑定。

state

如果授权请求中存在“STATE”参数。

此方法主要用于强制执行严格的状态检查,同时还可以轻松地从URI::

>>> from oauthlib.oauth2 import WebApplicationClient
>>> client = WebApplicationClient('your_id')
>>> uri = 'https://example.com/callback?code=sdfkjh345&state=sfetw45'
>>> client.parse_request_uri_response(uri, state='sfetw45')
{'state': 'sfetw45', 'code': 'sdfkjh345'}
>>> client.parse_request_uri_response(uri, state='other')
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "oauthlib/oauth2/rfc6749/__init__.py", line 357, in parse_request_uri_response
        back from the provider to you, the client.
    File "oauthlib/oauth2/rfc6749/parameters.py", line 153, in parse_authorization_code_response
        raise MismatchingStateError()
oauthlib.oauth2.rfc6749.errors.MismatchingStateError
prepare_request_body(code=None, redirect_uri=None, body='', include_client_id=True, code_verifier=None, **kwargs)[源代码]

准备访问令牌请求正文。

客户端通过在HTTP请求实体主体中添加以下参数来向令牌端点发出请求,该参数使用“app/x-www-form-urlencode”格式:

参数:
  • code -- 必填。从授权服务器接收的授权码。

  • redirect_uri -- 如果授权请求中包含“reDirect_uri”参数,则为必填项,如中所述 Section 4.1.1 ,并且它们的值必须相同。

  • body -- 要向其中嵌入参数的现有请求正文(URL编码字符串)。这可能包含额外的参数。默认为‘’。

  • include_client_id (Boolean) -- True (默认)发送 client_id in the body of the upstream request. This is required if the client is not authenticating with the authorization server as described in Section 3.2.1

  • code_verifier -- 可选。用于将授权请求与令牌请求相关联的加密随机字符串。

  • kwargs -- 要包括在令牌请求中的额外参数。

此外,OAuthLib将添加 grant_type 参数设置为 authorization_code

如果客户端类型为机密,或者向客户端颁发了客户端凭据(或分配了其他身份验证要求),则客户端必须向授权服务器进行身份验证,如中所述 Section 3.2.1 **

>>> from oauthlib.oauth2 import WebApplicationClient
>>> client = WebApplicationClient('your_id')
>>> client.prepare_request_body(code='sh35ksdf09sf')
'grant_type=authorization_code&code=sh35ksdf09sf'
>>> client.prepare_request_body(code_verifier='KB46DCKJ873NCGXK5GD682NHDKK34GR')
'grant_type=authorization_code&code_verifier=KB46DCKJ873NCGXK5GD682NHDKK34GR'
>>> client.prepare_request_body(code='sh35ksdf09sf', foo='bar')
'grant_type=authorization_code&code=sh35ksdf09sf&foo=bar'
Section 3.2.1 还声明:

在对令牌端点的“AUTHORIZATION_CODE”“GRANT_TYPE”请求中,未经身份验证的客户端必须发送其“客户端ID”,以防止自己无意中接受用于具有不同“客户端ID”的客户端的代码。这保护了客户端不会被替换身份验证码。(它不会为受保护的资源提供额外的安全性。)

prepare_request_uri(uri, redirect_uri=None, scope=None, state=None, code_challenge=None, code_challenge_method='plain', **kwargs)[源代码]

准备授权码请求URI

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

参数:
  • redirect_uri -- 可选。重定向URI必须是绝对URI,并且在使用之前应该已向OAuth提供程序注册。如中所述 Section 3.1.2

  • scope -- 可选。访问请求的范围如第节所述 3.3`_. 这些可以是任何字符串,但通常是URI或各种类别,例如 videosdocuments

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

  • code_challenge -- 可选。PKCE参数。如果强制执行PKCE,则为必填项。从授权请求中发送的CODE_VERIFIER派生的质询,稍后将对照其进行验证。

  • code_challenge_method -- 可选。PKCE参数。用于派生代码质询的方法。如果请求中不存在,则默认为“普通”。

  • kwargs -- 要包括在请求URI中的额外参数。

除了提供的参数外,OAuthLib还将附加 client_id 这是在构造函数中提供的,也是必需的 response_type 参数,设置为 code **

>>> from oauthlib.oauth2 import WebApplicationClient
>>> client = WebApplicationClient('your_id')
>>> client.prepare_request_uri('https://example.com')
'https://example.com?client_id=your_id&response_type=code'
>>> client.prepare_request_uri('https://example.com', redirect_uri='https://a.b/callback')
'https://example.com?client_id=your_id&response_type=code&redirect_uri=https%3A%2F%2Fa.b%2Fcallback'
>>> client.prepare_request_uri('https://example.com', scope=['profile', 'pictures'])
'https://example.com?client_id=your_id&response_type=code&scope=profile+pictures'
>>> client.prepare_request_uri('https://example.com', code_challenge='kjasBS523KdkAILD2k78NdcJSk2k3KHG6')
'https://example.com?client_id=your_id&response_type=code&code_challenge=kjasBS523KdkAILD2k78NdcJSk2k3KHG6'
>>> client.prepare_request_uri('https://example.com', code_challenge_method='S256')
'https://example.com?client_id=your_id&response_type=code&code_challenge_method=S256'
>>> client.prepare_request_uri('https://example.com', foo='bar')
'https://example.com?client_id=your_id&response_type=code&foo=bar'