私は両方の優れたツール [〜#〜] 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コマンドを使用して手動でテストしています...
私はそれを機能させたので自分に答えます。
実際、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
}
私にはそれは明確ではありませんでしたが、ユーザーをテストするための有効なトークンを入力しただけで、認証に必要なビューで機能しました:-)
トークン認証を使用している場合は、 この質問 を確認することをお勧めします
基本的には、これをsettings.py
に追加するだけです。
SWAGGER_SETTINGS = {
'SECURITY_DEFINITIONS': {
'api_key': {
'type': 'apiKey',
'in': 'header',
'name': 'Authorization'
}
},
}
Swagger UIページにAuthorizeボタンが表示されます。それをクリックして、入力テキストフィールドにAuthorization値を入力します。
私の問題は、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'
)
}
スキーマビューには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
提供する必要があります。これを改善できないようです、私がそうした場合、この投稿を更新します。
残りのフレームワーク設定を追加するだけで、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にダウングレードします。ボタン認証が機能するはずです。
この構成で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