Rename scopes= to scope= on the client-credentials OAuth providers (#3166)

This commit is contained in:
Max 2026-07-25 20:23:36 +01:00 • committed by GitHub
commit e90a66b554
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 34 additions and 18 deletions

View file

@ -112,7 +112,7 @@ A nightly job, a CI step, another service. There is no browser and nobody to cli
What changed:
* No `OAuthClientMetadata`, no handlers. You pass `client_id` and `client_secret`; the provider builds a minimal `client_credentials` registration around them and skips dynamic registration entirely.
* `scopes` is a space-separated string, the OAuth wire format.
* `scope` is a space-separated string, the OAuth wire format.
* Everything downstream is identical: the same `TokenStorage`, the same `httpx2.AsyncClient(auth=...)`, the same `streamable_http_client`.
By default the secret travels as HTTP Basic auth on the token request (`client_secret_basic`). Pass `token_endpoint_auth_method="client_secret_post"` to put it in the form body instead. Some authorization servers only accept one of the two.

View file

@ -1975,6 +1975,22 @@ async def callback_handler() -> AuthorizationCodeResult:
Forward the `iss` query parameter from the redirect so the validation can run: omitting it makes the flow fail with `OAuthFlowError` against servers that advertise `authorization_response_iss_parameter_supported`, and silently skips the check for servers that send `iss` without advertising it.
### `scopes=` renamed to `scope=` on the client-credentials providers
`ClientCredentialsOAuthProvider` and `PrivateKeyJWTOAuthProvider` took the requested scope as a keyword named `scopes`, even though the value is a single space-separated string, not a list. The parameter is now `scope`, matching the RFC 6749 wire parameter, `OAuthClientMetadata.scope`, and the newer `IdentityAssertionOAuthProvider`.
**Before (v1):**
```python
ClientCredentialsOAuthProvider(..., scopes="read write")
```
**After (v2):**
```python
ClientCredentialsOAuthProvider(..., scope="read write")
```
### Client rejects authorization server metadata with a mismatched `issuer`
During OAuth discovery, `OAuthClientProvider` now validates that the authorization server