如何在Swagger中包含Oauth2认证URL



我使用Django drf壮观的OAuth工具包来实现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")),
]

我该怎么修?

要使其可用于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)

oauth工具包确实提供了常规的html视图,而不是DRF视图。因此,它们不会出现在模式中,因为壮观只能解析任何DRF类型的视图。

您需要做的是添加一些设置,将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的url模式中(与您所做的一样(
  • 确保视图具有OAuth2Authentication和相应的permission_classes(直接或通过DRF默认设置(
  • 添加如上所述的设置。根据支持的流,您可能不需要所有这些URL,您必须在其中至少设置一些URL

最新更新