WebApplicationClient

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

A client utilizing the authorization code grant workflow.

A web application is a confidential client running on a web server. Resource owners access the client via an HTML user interface rendered in a user-agent on the device used by the resource owner. The client credentials as well as any access token issued to the client are stored on the web server and are not exposed to or accessible by the resource owner.

The authorization code grant type is used to obtain both access tokens and refresh tokens and is optimized for confidential clients. As a redirection-based flow, the client must be capable of interacting with the resource owner’s user-agent (typically a web browser) and capable of receiving incoming requests (via redirection) from the authorization server.

parse_request_uri_response(uri, state=None)[source]

Parse the URI query for code and state.

If the resource owner grants the access request, the authorization server issues an authorization code and delivers it to the client by adding the following parameters to the query component of the redirection URI using the “application/x-www-form-urlencoded” format:

Parameters:
  • uri – The callback URI that resulted from the user being redirected back from the provider to you, the client.
  • state – The state provided in the authorization request.
code
The authorization code generated by the authorization server. The authorization code MUST expire shortly after it is issued to mitigate the risk of leaks. A maximum authorization code lifetime of 10 minutes is RECOMMENDED. The client MUST NOT use the authorization code more than once. If an authorization code is used more than once, the authorization server MUST deny the request and SHOULD revoke (when possible) all tokens previously issued based on that authorization code. The authorization code is bound to the client identifier and redirection URI.
state
If the “state” parameter was present in the authorization request.

This method is mainly intended to enforce strict state checking with the added benefit of easily extracting parameters from the 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, **kwargs)[source]

Prepare the access token request body.

The client makes a request to the token endpoint by adding the following parameters using the “application/x-www-form-urlencoded” format in the HTTP request entity-body:

Parameters:
  • code – REQUIRED. The authorization code received from the authorization server.
  • redirect_uri – REQUIRED, if the “redirect_uri” parameter was included in the authorization request as described in Section 4.1.1, and their values MUST be identical.
  • body – Existing request body (URL encoded string) to embed parameters into. This may contain extra paramters. Default ‘’.
  • include_client_id (Boolean) – True (default) to send the 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.
  • kwargs – Extra parameters to include in the token request.

In addition OAuthLib will add the grant_type parameter set to authorization_code.

If the client type is confidential or the client was issued client credentials (or assigned other authentication requirements), the client MUST authenticate with the authorization server as described in 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='sh35ksdf09sf', foo='bar')
'grant_type=authorization_code&code=sh35ksdf09sf&foo=bar'
Section 3.2.1 also states:
In the “authorization_code” “grant_type” request to the token endpoint, an unauthenticated client MUST send its “client_id” to prevent itself from inadvertently accepting a code intended for a client with a different “client_id”. This protects the client from substitution of the authentication code. (It provides no additional security for the protected resource.)
prepare_request_uri(uri, redirect_uri=None, scope=None, state=None, **kwargs)[source]

Prepare the authorization code request URI

The client constructs the request URI by adding the following parameters to the query component of the authorization endpoint URI using the “application/x-www-form-urlencoded” format, per Appendix B:

Parameters:
  • redirect_uri – OPTIONAL. The redirect URI must be an absolute URI and it should have been registerd with the OAuth provider prior to use. As described in Section 3.1.2.
  • scope – OPTIONAL. The scope of the access request as described by Section 3.3`_. These may be any string but are commonly URIs or various categories such as videos or documents.
  • state – RECOMMENDED. An opaque value used by the client to maintain state between the request and callback. The authorization server includes this value when redirecting the user-agent back to the client. The parameter SHOULD be used for preventing cross-site request forgery as described in Section 10.12.
  • kwargs – Extra arguments to include in the request URI.

In addition to supplied parameters, OAuthLib will append the client_id that was provided in the constructor as well as the mandatory response_type argument, set to 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', foo='bar')
'https://example.com?client_id=your_id&response_type=code&foo=bar'