OAuth Toolkitを使用して、Rest APIに認証を追加しようとしました。ログインページにアクセスし、ユーザー名とパスワードを入力してから、APIにリダイレクトします。その後、メッセージ{"detail ":"認証資格情報が提供されませんでした。 "}これを調べてみましたが、問題を抱えているほとんどの人がRest_Framework設定から何かを見逃しているようです。私はそうは思いません。
これが私のコードです:
Settings.py
LOGIN_REDIRECT_URL = '/api/users/'
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
'oauth2_provider.ext.rest_framework.OAuth2Authentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAdminUser',
),
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
),
'DEFAULT_PARSER_CLASSES': (
'rest_framework.parsers.JSONParser',
),
}
url.py
urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)),
url(r'^accounts/login/$', auth_views.login, {'template_name': 'login.html'}),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^api-token-auth/', 'rest_framework.authtoken.views.obtain_auth_token'),
url(r'^o/', include('oauth2_provider.urls', namespace='oauth2_provider')),
url(r'^api/users/$', api.UserList.as_view()),
url(r'^api/users/(?P<pk>[0-9+]+)/$', api.UserDetail.as_view()),
)
api.py
@receiver(post_save, sender=User)
def init_new_user(sender, instance, signal, created, **kwargs):
if created:
Token.objects.create(user=instance)
class APIEndpoint(ProtectedResourceView):
def get(self, request, *args, **kwargs):
return HttpResponse('Protected with OAuth2!')
class UserViewSet(viewsets.ModelViewSet):
model = User
serializer_class = UserSerializer
def retrieve(self, request, pk=None):
if pk == 'me':
return Response(UserSerializer(request.user).data)
return super(UserViewSet, self).retrieve(request, pk)
class UserList(generics.ListCreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
class UserDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
私の場合、トークン認証はApacheではなく開発サーバーで正常に機能していました。その理由はまさに欠落したWSGIPassAuthorization On
持っている場合は、settings.pyを参照してください
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
このようなREST_FRAMEWORKでは、投稿するたびに認証されます。
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
)}
だから、それを削除します。
私の場合、ビューセットでpermissions.IsAuthenticatedOrReadOnly
権限クラスを使用しましたが、ログインせずにPOSTリクエストを送信しました。
class MemberViewSet(viewsets.ModelViewSet):
queryset = Member.objects.all()
serializer_class = MemberSerializer
permission_classes = (
permissions.IsAuthenticatedOrReadOnly,
)
@list_route(methods=['post'])
def check_activation_code(self, request):
# my custom action which do not need login
# I met the error in this action
do_something()
そのため、そのアクセス許可クラスのアクセス許可チェックは失敗します。
IsAuthenticatedOrReadOnly
パーミッションクラスを削除すると、すべてうまくいきます。