为什么我在 drf-spectaulous 的 swagger 中看不到授权按钮?

问题描述 投票:0回答:1

之前我们有一个单体,但现在我们正在转向微服务架构,这里是我的drf-spectaulous的设置,但我没有像以前那样的授权按钮,完全使用此设置而不是自定义身份验证是

rest_framework_simplejwt.authentication.JWTAuthentication
,

REST_FRAMEWORK = {
    'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
    'DEFAULT_AUTHENTICATION_CLASSES': ('custom.custom_authentication.CustomAuthentication',),
}
SPECTACULAR_SETTINGS = {
    'TITLE': 'My Title',
    'DESCRIPTION': 'My description',
    'VERSION': '0.0.1',
    'SERVE_INCLUDE_SCHEMA': False,
    'SERVE_PERMISSIONS': ['rest_framework.permissions.IsAdminUser'],
    'SERVE_AUTHENTICATION': [
        'rest_framework.authentication.SessionAuthentication',
        'custom.custom_authentication.CustomAuthentication',
    ],
    'SWAGGER_UI_SETTINGS': {"filter": True, "persistAuthorization": True}
}

看不到授权按钮可能是什么问题?

django django-rest-framework swagger-ui drf-spectacular
1个回答
0
投票

drf-spectacular
custom.custom_authentication.CustomAuthentication
而不是
JWTAuthentication
一起使用时,Swagger UI 中缺少“授权”按钮,这可能是由于与自定义身份验证类中的身份验证配置方式相关的多个因素造成的。这是帮助您排除故障的清单:

  1. 自定义身份验证类兼容性: 确保

    CustomAuthentication
    正确实施
    authenticate_header
    。 Swagger 需要此标头来触发授权提示。

    from rest_framework.authentication import BaseAuthentication
    
    class CustomAuthentication(BaseAuthentication):
        def authenticate_header(self, request):
            return 'Bearer'
    

    此方法至关重要,因为它告诉 Swagger 应显示 Bearer 令牌的授权选项。

  2. 检查

    SPECTACULAR_SETTINGS
    的安全方案: 由于
    drf-spectacular
    依赖 OpenAPI 设置来显示授权选项,因此您可能需要显式定义您的安全方案。为您的自定义身份验证添加
    SECURITY_DEFINITIONS
    条目:

    SPECTACULAR_SETTINGS = {
        'TITLE': 'My Title',
        'DESCRIPTION': 'My description',
        'VERSION': '0.0.1',
        'SERVE_INCLUDE_SCHEMA': False,
        'SERVE_PERMISSIONS': ['rest_framework.permissions.IsAdminUser'],
        'SERVE_AUTHENTICATION': [
            'rest_framework.authentication.SessionAuthentication',
            'custom.custom_authentication.CustomAuthentication',
        ],
        'SWAGGER_UI_SETTINGS': {"filter": True, "persistAuthorization": True},
        'SECURITY_DEFINITIONS': {
            'CustomAuth': {
                'type': 'http',
                'scheme': 'bearer',
                'bearerFormat': 'JWT',
            },
        },
        'SECURITY': [{'CustomAuth': []}],  # Ensures the scheme is used by default
    }
    

    此配置告诉 Swagger 使用 Bearer 令牌进行授权。

  3. 确保

    persistAuthorization
    已启用: 确认
    "persistAuthorization": True
    已设置在
    SWAGGER_UI_SETTINGS
    下,它已在您的设置中。此设置使授权标头在页面重新加载时保持活动状态。

  4. 重新检查权限和身份验证: 如果您在开发中进行测试,请确保您的自定义身份验证和权限正确返回

    IsAdminUser
    或您可能需要的任何其他权限。

  5. 清除缓存并刷新 UI: 有时 Swagger UI 会缓存设置,尤其是在开发期间。清除浏览器缓存并刷新页面以确保更改生效。

这些步骤应有助于使用自定义身份验证类恢复“授权”按钮。如果调整后该按钮仍然没有出现,请告诉我!

© www.soinside.com 2019 - 2024. All rights reserved.