0

我将 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")),
]

我该如何解决?

4

2 回答 2

0

要使其可用于招摇,您必须覆盖 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)
于 2022-02-25T05:06:59.190 回答
0

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 个步骤才能使其完全正常运行:

  • 将视图添加到 urlpatterns oauth2_provider(如您所做的那样)
  • 确保视图具有OAuth2Authentication相应的permission_classes(直接或通过 DRF 默认设置)
  • 如上所述添加设置。您可能不需要所有这些,具体取决于您必须在那里设置至少一些 URL 的支持流。
于 2022-02-23T18:22:11.063 回答