Browse Source

🐛 Add missing password format to OAuth2PasswordRequestFormStrict

The strict variant was missing `json_schema_extra={"format": "password"}`
on its `password` and `client_secret` fields, unlike the non-strict
`OAuth2PasswordRequestForm` which already had them.  This meant the
Swagger UI rendered those fields as plain text inputs instead of masked
password inputs when using the strict form.

Signed-off-by: cluster2600 <[email protected]>
Signed-off-by: Maxime Grenu <[email protected]>
pull/15079/head
Maxime Grenu 3 months ago
parent
commit
1de6760d94
No known key found for this signature in database GPG Key ID: 532A7B7866CFDC51
  1. 4
      fastapi/security/oauth2.py
  2. 7
      tests/test_security_oauth2.py
  3. 7
      tests/test_security_oauth2_optional.py
  4. 7
      tests/test_security_oauth2_optional_description.py

4
fastapi/security/oauth2.py

@ -255,7 +255,7 @@ class OAuth2PasswordRequestFormStrict(OAuth2PasswordRequestForm):
], ],
password: Annotated[ password: Annotated[
str, str,
Form(), Form(json_schema_extra={"format": "password"}),
Doc( Doc(
""" """
`password` string. The OAuth2 spec requires the exact field name `password` string. The OAuth2 spec requires the exact field name
@ -306,7 +306,7 @@ class OAuth2PasswordRequestFormStrict(OAuth2PasswordRequestForm):
] = None, ] = None,
client_secret: Annotated[ client_secret: Annotated[
str | None, str | None,
Form(), Form(json_schema_extra={"format": "password"}),
Doc( Doc(
""" """
If there's a `client_password` (and a `client_id`), they can be sent If there's a `client_password` (and a `client_id`), they can be sent

7
tests/test_security_oauth2.py

@ -213,7 +213,11 @@ def test_openapi_schema():
"type": "string", "type": "string",
}, },
"username": {"title": "Username", "type": "string"}, "username": {"title": "Username", "type": "string"},
"password": {"title": "Password", "type": "string"}, "password": {
"title": "Password",
"type": "string",
"format": "password",
},
"scope": { "scope": {
"title": "Scope", "title": "Scope",
"type": "string", "type": "string",
@ -226,6 +230,7 @@ def test_openapi_schema():
"client_secret": { "client_secret": {
"title": "Client Secret", "title": "Client Secret",
"anyOf": [{"type": "string"}, {"type": "null"}], "anyOf": [{"type": "string"}, {"type": "null"}],
"format": "password",
}, },
}, },
}, },

7
tests/test_security_oauth2_optional.py

@ -214,7 +214,11 @@ def test_openapi_schema():
"type": "string", "type": "string",
}, },
"username": {"title": "Username", "type": "string"}, "username": {"title": "Username", "type": "string"},
"password": {"title": "Password", "type": "string"}, "password": {
"title": "Password",
"type": "string",
"format": "password",
},
"scope": { "scope": {
"title": "Scope", "title": "Scope",
"type": "string", "type": "string",
@ -227,6 +231,7 @@ def test_openapi_schema():
"client_secret": { "client_secret": {
"title": "Client Secret", "title": "Client Secret",
"anyOf": [{"type": "string"}, {"type": "null"}], "anyOf": [{"type": "string"}, {"type": "null"}],
"format": "password",
}, },
}, },
}, },

7
tests/test_security_oauth2_optional_description.py

@ -215,7 +215,11 @@ def test_openapi_schema():
"type": "string", "type": "string",
}, },
"username": {"title": "Username", "type": "string"}, "username": {"title": "Username", "type": "string"},
"password": {"title": "Password", "type": "string"}, "password": {
"title": "Password",
"type": "string",
"format": "password",
},
"scope": { "scope": {
"title": "Scope", "title": "Scope",
"type": "string", "type": "string",
@ -228,6 +232,7 @@ def test_openapi_schema():
"client_secret": { "client_secret": {
"title": "Client Secret", "title": "Client Secret",
"anyOf": [{"type": "string"}, {"type": "null"}], "anyOf": [{"type": "string"}, {"type": "null"}],
"format": "password",
}, },
}, },
}, },

Loading…
Cancel
Save