2

フロントエンドでSatellizerをクライアントとして使用し、 django rest frameworkを使用してバックエンドでpython social authを使用して、単一ページの角度アプリで認証を有効にしようとしています。主な問題は、セッション認証の代わりにJWTを使用したいということです。

social/complete/backendユーザーがポップアップ ウィンドウを(python social auth view)に確認した後に取得した応答を渡そうとしましたが、うまくいきませんでした。

Google 構成の satellizer に次のように記述しました。

        $authProvider.google({
            clientId:'609163425136-1i7b7jlr4j4hlqtnb1gk3al2kagavcjm.apps.googleusercontent.com',
            url: 'social/complete/google-oauth2/',
            optionalUrlParams: ['display', 'state'],
            state: function() {
                return Math.random();
            }
        });

私が遭遇する問題は、python social authにあります:

必要なパラメーターの状態がありません

google- oauth2 および

必要なパラメーターコードがありません

フェイスブック用。

これらのパラメーターはリクエスト ペイロードに存在し、独自のカスタム ビューで取得できるため、これは非常に奇妙です。


解決策に最も近いのは、パラメーターをstate正常に受け入れることができる独自のビューを作成することです。

これは、応答を処理し、 django-rest-framework-jwtを使用して新しい jwt トークンを作成する私のビューです。

class SocialAuthView(APIView):
    throttle_classes = ()
    permission_classes = ()
    authentication_classes = ()

    social_serializer = SocialAuthSerializer
    user_serializer = None

    def post(self, request):
        access_token_url = 'https://accounts.google.com/o/oauth2/token'
        people_api_url = 'https://www.googleapis.com/plus/v1/people/me/openIdConnect'

        from django.conf import settings
        payload = dict(client_id=request.data['clientId'],
                       redirect_uri=request.data['redirectUri'],
                       client_secret=settings.SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET,
                       code=request.data['code'],
                       grant_type='authorization_code')

        # Step 1. Exchange authorization code for access token.
        import requests
        import json
        r = requests.post(access_token_url, data=payload)
        token = json.loads(r.text)
        headers = {'Authorization': 'Bearer {0}'.format(token['access_token'])}

        # Step 2. Retrieve information about the current user.
        r = requests.get(people_api_url, headers=headers)
        profile = json.loads(r.text)

        try:
            user = User.objects.filter(email=profile['email'])[0]
        except IndexError:
            pass
        import jwt
        from rest_framework_jwt.utils import jwt_payload_handler, jwt_encode_handler
        if user:
            payload = jwt_payload_handler(user)
            token = jwt_encode_handler(payload)
            return Response({'token': token.decode('unicode_escape')},
                            status=status.HTTP_200_OK)
        u = User.objects.create(username=profile['name'], first_name=profile['given_name'],
                                last_name=profile['family_name'], email=profile['email'])
        payload = jwt_payload_handler(user)
        token = jwt_encode_handler(payload)
        return Response({'Bearer': token.decode('unicode_escape')},
                        status=status.HTTP_200_OK)

つまり、機能しますが、Python ソーシャル認証で実装できた場合に得られるすべての利点が得られるわけではありません。このビューからdo_authのようないくつかの関数を呼び出す python social auth で認証する方法があるかもしれません。

この問題にどれだけ苦労しているかに驚かされます。

すべてのヘルプは大歓迎です。

tl,dr : Satellizerdjango-rest-frameworkpython social authおよびJWTを使用して角度のある単一ページアプリケーションを実装する方法は?

4

1 に答える 1

4

完全な答えではありませんが、コメントするのに十分な評判がありません。私は似たようなことをしようとしてきました。Satellizer は、電子メール/パス トークン認証用の DRF の djoser モジュールとうまく連携します。社会的な側面に関しては、OAuth2 は非常に複雑だと思います。次のプロジェクトを見たいと思うかもしれません(私とは関係ありません)、それを実装しようとしているようです(angularjs-satellizer/psa/jwt):

https://github.com/hsr-ba-fs15-dat/opendatahub

具体的には: https://github.com/hsr-ba-fs15-dat/opendatahub/blob/master/src/main/python/authentication/views.py

于 2015-08-06T12:26:06.620 に答える