2017-06-09 10 views
1

私はDjangoのデフォルトのビューを使用してトークンを生成します。Djangoでトークンを持つユーザーIDを返すにはどうすればいいですか?

url(r'^login/', rest_auth_views.obtain_auth_token), 

私のフロントエンドは、現在のユーザーIDでログインしているかわかりませんので、私は問題を抱えています。

トークンで返すか、別のリクエストを作成する必要がありますか?

さまざまな方法がありますが、私は最適なソリューションを選択したいと思います。

答えて

3

あなたが望む結果を得るには、rest_framework.authtoken.views.ObtainAuthToken.postを上書きすることができます。

myappに/ views.py

from rest_framework.authtoken.views import ObtainAuthToken 
from rest_framework.authtoken.models import Token 
from rest_framework.response import Response 


class CustomObtainAuthToken(ObtainAuthToken): 
    def post(self, request, *args, **kwargs): 
     response = super(CustomObtainAuthToken, self).post(request, *args, **kwargs) 
     token = Token.objects.get(key=response.data['token']) 
     return Response({'token': token.key, 'id': token.user_id}) 

myappに/ urls.py

from django.conf.urls import url 

from .views import CustomObtainAuthToken 

urlpatterns = [ 
    url(r'^authenticate/', CustomObtainAuthToken.as_view()), 
] 

サンプル

$ http :8000/authenticate/ username=someuser password=secretpassword 
HTTP/1.0 200 OK 
Allow: POST, OPTIONS 
Content-Language: en 
Content-Type: application/json 
Date: Tue, 22 Mar 2017 18:30:10 GMT 
Server: WSGIServer/0.2 CPython/3.5.1 
Vary: Accept-Language, Cookie 
X-Frame-Options: SAMEORIGIN 

{ 
    "id": 16, 
    "token": "82e0bc9980a6b2c9a70969b0f8dc974418dda399" 
} 

アイデア彼の結果ObtainAuthTokenビュー・クラスのpostメソッドをオーバーライドする必要があります。ここでは、親クラスを呼び出してトークンを取得し、そのトークンを参照して関連付けられたユーザーIDを検索します。

希望に役立ちます。

+0

はい、助かりました。これはまさに私が達成したかったものです。私はこれが正しい習慣を持つ一貫した解決策であることを願っています。 – wahtdbogh

1

ウェブページでユーザー情報を取得する必要がある場合は、ログインAPIやその他のAPIの応答でユーザー情報を渡す必要があります。

トークンベースの認証を使用している間、ログイン後、アクセストークンとリフレッシュトークンが生成され、ログインAPIの応答でクライアントに与えられます。あなたのビューでauthentication_classes = [OAuth2Authentication] を配置する必要があり

Authorization : Bearer <insert token here> 

:このアクセストークンは、ヘッダーに渡されなければなりません。

これは、ユーザーがログインしているかどうかを確認し、ログインしたユーザーの情報にuser=request.userでアクセスするようになります。

0

私は、ログインAPIの応答でユーザーの詳細を返すことをお勧めします。

build_inビューでユーザーの詳細が返されない場合は、obtain_auth_tokenのpostメソッドをオーバーライドできます。私は一度だけ、私はあなたがやろうとしているものを達成するだけでなく、ユーザオブジェクトを追加token詳細を持っていたデフォルトresponse_data辞書でトークン方法を得る

djangorestframework、JWTのため
def post(self, request, *args, **kwargs): 
    serializer = self.get_serializer(data=request.data) 

    if serializer.is_valid(): 
     user = serializer.object.get('user') or request.user 
     token = serializer.object.get('token') 
     response_data = { 
      'token': token, 
      'user': UserSerializer(user).data 
     } 
     response = Response(response_data, status=status.HTTP_200_OK) 
     if api_settings.JWT_AUTH_COOKIE: 
      expiration = (datetime.utcnow() + 
          api_settings.JWT_EXPIRATION_DELTA) 
      response.set_cookie(api_settings.JWT_AUTH_COOKIE, 
           response.data['token'], 
           expires=expiration, 
           httponly=True) 
     return response 

    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

をこれをしました。

関連する問題