'Constructor for OAuth2WebServerFlow.
The kwargs argument is used to set extra query parameters on the
auth_uri. For example, the access_type and prompt
query parameters can be set via kwargs.
Args:
client_id: string, client identifier.
client_secret: string client secret.
scope: string or iterable of strings, scope(s) of the credentials
being requested.
redirect_uri: string, Either the string \'urn:ietf:wg:oauth:2.0:oob\'
for a non-web-based application, or a URI that
handles the callback from the authorization server.
user_agent: string, HTTP User-Agent to provide for this
application.
auth_uri: string, URI for authorization endpoint. For convenience
defaults to Google\'s endpoints but any OAuth 2.0 provider
can be used.
token_uri: string, URI for token endpoint. For convenience
defaults to Google\'s endpoints but any OAuth 2.0
provider can be used.
revoke_uri: string, URI for revoke endpoint. For convenience
defaults to Google\'s endpoints but any OAuth 2.0
provider can be used.
login_hint: string, Either an email address or domain. Passing this
hint will either pre-fill the email box on the sign-in
form or select the proper multi-login session, thereby
simplifying the login flow.
device_uri: string, URI for device authorization endpoint. For
convenience defaults to Google\'s endpoints but any
OAuth 2.0 provider can be used.
authorization_header: string, For use with OAuth 2.0 providers that
require a client to authenticate using a
header value instead of passing client_secret
in the POST body.
pkce: boolean, default: False, Generate and include a "Proof Key
for Code Exchange" (PKCE) with your authorization and token
requests. This adds security for installed applications that
cannot protect a client_secret. See RFC 7636 for details.
code_verifier: bytestring or None, default: None, parameter passed
as part of the code exchange when pkce=True. If
None, a code_verifier will automatically be
generated as part of step1_get_authorize_url(). See
RFC 7636 for details.
**kwargs: dict, The keyword arguments are all optional and required
parameters for the OAuth calls.'

@_helpers.positional(4)
def __init__(self, client_id, client_secret=None, scope=None, redirect_uri=None, user_agent=None, auth_uri=oauth2client.GOOGLE_AUTH_URI, token_uri=oauth2client.GOOGLE_TOKEN_URI, revoke_uri=oauth2client.GOOGLE_REVOKE_URI, login_hint=None, device_uri=oauth2client.GOOGLE_DEVICE_URI, token_info_uri=oauth2client.GOOGLE_TOKEN_INFO_URI, authorization_header=None, pkce=False, code_verifier=None, **kwargs):

    if (scope is None):
        raise TypeError('The    value    of    scope    must    not    be    None')
    self.client_id = client_id
    self.client_secret = client_secret
    self.scope = _helpers.scopes_to_string(scope)
    self.redirect_uri = redirect_uri
    self.login_hint = login_hint
    self.user_agent = user_agent
    self.auth_uri = auth_uri
    self.token_uri = token_uri
    self.revoke_uri = revoke_uri
    self.device_uri = device_uri
    self.token_info_uri = token_info_uri
    self.authorization_header = authorization_header
    self._pkce = pkce
    self.code_verifier = code_verifier
    self.params = _oauth2_web_server_flow_params(kwargs)
