如何在 Swagger 中包含 Oauth2 身份验证网址?
How to include Oauth2 auth urls in Swagger?
我将 Django drf-spectacular OAuth Toolkit 用于 Oauth2 密码流。遗憾的是,Swagger 无法识别授权 URL。
这是我的 urls.py
urlpatterns = [
# schema
path("api/schema/", SpectacularAPIView.as_view(api_version='v1'), name="schema"),
path(
"api/schema/swagger/",
SpectacularSwaggerView.as_view(url_name="schema"),
name="swagger-ui",
),
path(
"api/schema/redoc/",
SpectacularRedocView.as_view(url_name="schema"),
name="redoc",
),
path("api/oauth/", include("apps.main.oauth.urls", namespace="oauth2_provider")),
]
我该如何解决?
oauth 工具包确实提供了常规 html 视图,这些视图不是 DRF 视图。因此它们不会出现在架构中,因为 spectacular 只能解析任何 DRF-type 视图。
您需要做的是添加一些设置,将 SwaggerUI 定向到那些授权视图:
SPECTACULAR_SETTINGS = {
# Oauth2 related settings. used for example by django-oauth2-toolkit.
# https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.3.md#oauth-flows-object
'OAUTH2_FLOWS': [],
'OAUTH2_AUTHORIZATION_URL': None,
'OAUTH2_TOKEN_URL': None,
'OAUTH2_REFRESH_URL': None,
'OAUTH2_SCOPES': None,
# other spectcular settings
}
所以基本上需要 3 个步骤才能使其完全正常工作:
- 将视图添加到
oauth2_provider
的 urlpatterns(就像您所做的那样)
- 确保视图具有
OAuth2Authentication
和相应的 permission_classes
(直接或通过 DRF 默认设置)
- 添加上述设置。您可能不需要所有这些,具体取决于您必须在那里设置至少一些 URL 的受支持流程。
要使其可用于 swagger,您必须覆盖 Oauth API,例如,覆盖令牌 API 并在 @extend_schema 中编写内联序列化程序并通过post 方法。
from drf_spectacular.utils import extend_schema, inline_serializer
from oauth2_provider.views.application import TokenView
class TokenApiView(TokenView, APIView):
@extend_schema(
request=inline_serializer(
name="InlineTokenSerializer",
fields={
"username": serializers.CharField(),
"password": serializers.CharField(),
"grant_type": serializers.CharField(required=False),
"Scope": serializers.CharField(required=False),
"client_id": serializers.CharField(),
},
)
)
def post(self, request, *args, **kwargs):
return super().post(request, *args, **kwargs)
我将 Django drf-spectacular OAuth Toolkit 用于 Oauth2 密码流。遗憾的是,Swagger 无法识别授权 URL。 这是我的 urls.py
urlpatterns = [
# schema
path("api/schema/", SpectacularAPIView.as_view(api_version='v1'), name="schema"),
path(
"api/schema/swagger/",
SpectacularSwaggerView.as_view(url_name="schema"),
name="swagger-ui",
),
path(
"api/schema/redoc/",
SpectacularRedocView.as_view(url_name="schema"),
name="redoc",
),
path("api/oauth/", include("apps.main.oauth.urls", namespace="oauth2_provider")),
]
我该如何解决?
oauth 工具包确实提供了常规 html 视图,这些视图不是 DRF 视图。因此它们不会出现在架构中,因为 spectacular 只能解析任何 DRF-type 视图。
您需要做的是添加一些设置,将 SwaggerUI 定向到那些授权视图:
SPECTACULAR_SETTINGS = {
# Oauth2 related settings. used for example by django-oauth2-toolkit.
# https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.3.md#oauth-flows-object
'OAUTH2_FLOWS': [],
'OAUTH2_AUTHORIZATION_URL': None,
'OAUTH2_TOKEN_URL': None,
'OAUTH2_REFRESH_URL': None,
'OAUTH2_SCOPES': None,
# other spectcular settings
}
所以基本上需要 3 个步骤才能使其完全正常工作:
- 将视图添加到
oauth2_provider
的 urlpatterns(就像您所做的那样) - 确保视图具有
OAuth2Authentication
和相应的permission_classes
(直接或通过 DRF 默认设置) - 添加上述设置。您可能不需要所有这些,具体取决于您必须在那里设置至少一些 URL 的受支持流程。
要使其可用于 swagger,您必须覆盖 Oauth API,例如,覆盖令牌 API 并在 @extend_schema 中编写内联序列化程序并通过post 方法。
from drf_spectacular.utils import extend_schema, inline_serializer
from oauth2_provider.views.application import TokenView
class TokenApiView(TokenView, APIView):
@extend_schema(
request=inline_serializer(
name="InlineTokenSerializer",
fields={
"username": serializers.CharField(),
"password": serializers.CharField(),
"grant_type": serializers.CharField(required=False),
"Scope": serializers.CharField(required=False),
"client_id": serializers.CharField(),
},
)
)
def post(self, request, *args, **kwargs):
return super().post(request, *args, **kwargs)