如何在 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)