web-dev-qa-db-ja.com

トークン認証をswagger + Django RESTフレームワークに追加する方法?

私は両方の優れたツール [〜#〜] drf [〜#〜] および Django-REST-Swagger を使用していますが、APIビューのいくつかはトークン認証下にあります。

それでは、私のAPIのswagger docページに、Tokenヘッダーを含むこれらのトークン認証APIのURLをテストする可能性を追加したいと思います。どうすればこれができますか?.

私のクラスAPIビューのスナップショットは次のとおりです:

class BookList(APIView):
    """
    List all books, or create a new book.
    """
    authentication_classes = (TokenAuthentication, )
    permission_classes = (IsAuthenticated,)
    ...

Swaggerは多くのことを自動検出するので、トークン認証に気づき、WebインターフェースでトークンまたはユーザーIDについて質問することを期待していましたが、そうではありませんでした。したがって、CURLコマンドを使用して手動でテストしています...

22
miguelfg

私はそれを機能させたので自分に答えます。

実際、Swagger設定には、api_key->のオプションがあります。

SWAGGER_SETTINGS = {
    "exclude_namespaces": [], # List URL namespaces to ignore
    "api_version": '0.1',  # Specify your API's version
    "api_path": "/",  # Specify the path to your API not a root level
    "enabled_methods": [  # Specify which methods to enable in Swagger UI
        'get',
        'post',
        'put',
        'patch',
        'delete'
    ],
    "api_key": '', # An API key
    "is_authenticated": False,  # Set to True to enforce user authentication,
    "is_superuser": False,  # Set to True to enforce admin only access
}

私にはそれは明確ではありませんでしたが、ユーザーをテストするための有効なトークンを入力しただけで、認証に必要なビューで機能しました:-)

11
miguelfg

トークン認証を使用している場合は、 この質問 を確認することをお勧めします

基本的には、これをsettings.pyに追加するだけです。

SWAGGER_SETTINGS = {
    'SECURITY_DEFINITIONS': {
        'api_key': {
            'type': 'apiKey',
            'in': 'header',
            'name': 'Authorization'
        }
    },
}

Swagger UIページにAuthorizeボタンが表示されます。それをクリックして、入力テキストフィールドにAuthorization値を入力します。

24
Melvic Ybanez

私の問題は、TokenAuthentificationをアクティブにした後、AuthentificationErrorが原因で、私のurlがswagger UIに表示されなくなったことです。
私にとっての解決策は、Django Rest Framework設定で両方の認証クラスをアクティブにすることでした:
SessionAuthentification-> Swagger UI
TokenAuthentification-> Restクライアント用

REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAdminUser',),
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.TokenAuthentication',
    'rest_framework.authentication.SessionAuthentication'
)

}

7
matyas

スキーマビューにはAllowAnyの権限が必要です。これにより、ユーザーが認証される前に、プラグインは使用可能なエンドポイントを確認できます。エンドポイントは、正しくセットアップされていれば保護されているはずです。例:

@api_view()
@renderer_classes([SwaggerUIRenderer, OpenAPIRenderer, renderers.CoreJSONRenderer])
@authentication_classes((TokenAuthentication, SessionAuthentication))
@permission_classes((AllowAny,))
def schema_view(request):
    generator = schemas.SchemaGenerator(
        title='My API end points',
        patterns=my_urls,
        url="/api/v1/")
    return response.Response(generator.get_schema(request=request))

SessionAuthenticationを削除してTokenAuthenticationのみを使用するのが最善ですが、それは選択の問題であり、ここでは削除しました

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated'
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication'
)

必ず追加してください'rest_framework.authtoken'をインストール済みアプリに追加し、ミドルウェアクラスからCsrfViewMiddlewareを削除します。そしてSwagger設定

SWAGGER_SETTINGS = {
    'SECURITY_DEFINITIONS': {
        'api_key': {
            'type': 'apiKey',
            'in': 'header',
            'name': 'Authorization'
        }
    },
    'USE_SESSION_AUTH': False,
    'JSON_EDITOR': True,
}

これにより、swaggerはすべてのサンプルcurlコマンドにもトークンを入力します。これは本当に便利です。セッション認証をそのままにしておくと、これが無効になるようです。

Swagger認証ダイアログはapi_key提供する必要があります。これを改善できないようです、私がそうした場合、この投稿を更新します。

7
oden

残りのフレームワーク設定を追加するだけで、SessionAuthenticationが一番上になるはずです

'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
        'mymodule.authentication.CustomeAuthentication',
)

注:SessionAuthenticationではDjangoログインセッションを使用します

CustomeAuthenticationは、実際のユースケースのREST APIに使用されます。

django-rest-swagger == 2.2.0を使用して@Melvic Ybanezの回答を実装していても機能しない場合。 Django-rest-swagger == 2.1.2にダウングレードします。ボタン認証が機能するはずです。

1
Diego Puente

この構成でSwaggerのデフォルトの基本認証をトークン認証に変更できましたが、「試してみる」ボタンを押すと、残りのswaggerは有効なトークンに関係なくすべての認証を受け入れます。

また、settings.pyのREST_FRAMEWORKにSessionAuthenticationを追加すると、SwaggerドキュメントにAPIを表示できませんでした。

Django-rest-swagger == 2.2.0 djangorestframework == 3.7.7

settings.py

INSTALLED_APPS = [
    'rest_framework',
    'rest_framework_swagger',
    'rest_framework.authtoken',
]

REST_FRAMEWORK = {
    # Parser classes priority-wise for Swagger
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
        'rest_framework.parsers.JSONParser',
        'rest_framework.authentication.TokenAuthentication',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ) 
}

# SWAGGER SETTINGS
SWAGGER_SETTINGS = {
    'SECURITY_DEFINITIONS': {
        'api_Key': {
            'type': 'apiKey',
            'in': 'header',
            'name': 'Token Authorization'
        }
    },
}

役立つドキュメント https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#security-definitions-object