2013-07-25 27 views
26

私はソーシャルログインのために私のウェブサイトでdjango-allauthを使用しています。私はまた、モバイルアプリケーションのバックエンドとして機能するdjango-rest-frameworkによって強化されたREST APIを持っています。 allauthの認証バックエンドをREST APIに直接接続して、モバイルアプリでFacebookログインを使用しているユーザーを検証(登録)できる方法はありますか?django-rest-frameworkのエンドポイントとしてdjango-allauthを差し込みます

明確にする:Facebookのログイン部分は、ネイティブSDKによって処理されます。 POST /userのように動作するエンドポイントが必要です(新しいユーザーを作成します)が、電子メール/パスワードなどの代わりに入力としてFacebookのoauthトークンを使用します。

+0

django-oauth-toolkitとpython-social-authを使用した[oauth2トークン認証]の複製が可能です(http://stackoverflow.com/questions/27051209/oauth2-token-authentication-using-djeno-autautication-using-djeno-autautication-using-djeno-autaut-toolkit- and-python-social-auth) –

答えて

2

私はallauthとrest-一緒にfremework、allauth does not offer such an endpoint

提案:login_by_tokenで作成されたようsocialtokenがある
コールallauth.socialaccount.providers.facebook.views.fb_complete_login(なし、socialtoken):以下のバリエーションを行い、その独自のものを作ります。これはdjango.contrib.auth.loginを実行します(もっと深く)。

その後、モバイルデバイス上で使用するために、それはAUTH(ないFB)トークンに可能であるかもしれない:(セッションから?)ユーザデータを取得し、

をrest_framework.authtoken.views.obtain_auth_token呼び出します注:
1.電子メールの競合を解決したり、ソーシャル/ローカルのACTを接続する方法はありません。
2.私はそれを試していない - それを働かせることができればコードを投稿してください。

9

あなたは社会的な認証django-rest-framework-social-oauth2このlibrayを使用することができます。あなたが依存している。このためDjango Rest Authを使用することができます

urls.py

urlpatterns = [ 
    url(
     r'^rest/facebook-login/$', 
     csrf_exempt(RestFacebookLogin.as_view()), 
     name='rest-facebook-login' 
    ), 
] 

serializers.py

class EverybodyCanAuthentication(SessionAuthentication): 
    def authenticate(self, request): 
     return None 

views.py

class RestFacebookLogin(APIView): 
    """ 
    Login or register a user based on an authentication token coming 
    from Facebook. 
    Returns user data including session id. 
    """ 

    # this is a public api!!! 
    permission_classes = (AllowAny,) 
    authentication_classes = (EverybodyCanAuthentication,) 

    def dispatch(self, *args, **kwargs): 
     return super(RestFacebookLogin, self).dispatch(*args, **kwargs) 

    def get(self, request, *args, **kwargs): 
     try: 
      original_request = request._request 
      auth_token = request.GET.get('auth_token', '') 

      # Find the token matching the passed Auth token 
      app = SocialApp.objects.get(provider='facebook') 
      fb_auth_token = SocialToken(app=app, token=auth_token) 

      # check token against facebook 
      login = fb_complete_login(original_request, app, fb_auth_token) 
      login.token = fb_auth_token 
      login.state = SocialLogin.state_from_request(original_request) 

      # add or update the user into users table 
      complete_social_login(original_request, login) 
      # Create or fetch the session id for this user 
      token, _ = Token.objects.get_or_create(user=original_request.user) 
      # if we get here we've succeeded 
      data = { 
       'username': original_request.user.username, 
       'objectId': original_request.user.pk, 
       'firstName': original_request.user.first_name, 
       'lastName': original_request.user.last_name, 
       'sessionToken': token.key, 
       'email': original_request.user.email, 
      } 
      return Response(
       status=200, 
       data=data 
      ) 

     except: 
      return Response(status=401, data={ 
       'detail': 'Bad Access Token', 
      }) 
0

このジャンゴ・allauth関連のコードを試してみてくださいdjango-allauth。統合が非常に簡単です。

関連する問題