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或各种类别,例如
videos
或documents
。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'