Generate an authorization URL and state. :param url: Authorization endpoint url, must be HTTPS. :param state: An optional state string for CSRF protection. If not given it will be generated for you. :param code_verifier: An optional code_verifier for co
(self, url, state=None, code_verifier=None, **kwargs)
| 142 | self.token_auth.set_token(token) |
| 143 | |
| 144 | def create_authorization_url(self, url, state=None, code_verifier=None, **kwargs): |
| 145 | """Generate an authorization URL and state. |
| 146 | |
| 147 | :param url: Authorization endpoint url, must be HTTPS. |
| 148 | :param state: An optional state string for CSRF protection. If not |
| 149 | given it will be generated for you. |
| 150 | :param code_verifier: An optional code_verifier for code challenge. |
| 151 | :param kwargs: Extra parameters to include. |
| 152 | :return: authorization_url, state |
| 153 | """ |
| 154 | if state is None: |
| 155 | state = generate_token() |
| 156 | |
| 157 | response_type = self.metadata.get("response_type", "code") |
| 158 | response_type = kwargs.pop("response_type", response_type) |
| 159 | if "redirect_uri" not in kwargs: |
| 160 | kwargs["redirect_uri"] = self.redirect_uri |
| 161 | if "scope" not in kwargs: |
| 162 | kwargs["scope"] = self.scope |
| 163 | |
| 164 | if ( |
| 165 | code_verifier |
| 166 | and response_type == "code" |
| 167 | and self.code_challenge_method == "S256" |
| 168 | ): |
| 169 | kwargs["code_challenge"] = create_s256_code_challenge(code_verifier) |
| 170 | kwargs["code_challenge_method"] = self.code_challenge_method |
| 171 | |
| 172 | for k in self.EXTRA_AUTHORIZE_PARAMS: |
| 173 | if k not in kwargs and k in self.metadata: |
| 174 | kwargs[k] = self.metadata[k] |
| 175 | |
| 176 | uri = prepare_grant_uri( |
| 177 | url, |
| 178 | client_id=self.client_id, |
| 179 | response_type=response_type, |
| 180 | state=state, |
| 181 | **kwargs, |
| 182 | ) |
| 183 | return uri, state |
| 184 | |
| 185 | def fetch_token( |
| 186 | self, |