سؤال

بدأت للتو اللعب مع Tornado وترغب في تقديم طرق متعددة للمصادقة. حاليًا يعمل تطبيقي بشكل جيد مع Google OpenID/OAUTH باستخدام Tornado.auth.googlemixin ويتم إرسال المستخدمين غير المصادقين تلقائيًا إلى صفحة مصادقة Google.

إذا أراد مستخدم غير مصادق استخدام خيار آخر (أي المصادقة المحلية أو Tornado.auth.twittermixin) ، كيف يمكنني تنفيذ المنطق لاختيار آلية مصادقة داخل معالج تسجيل الدخول؟

لقد أضفت ديكور "Tornado.web.Aunitedicated" إلى جميع أساليب مكشوفة ، وهنا فئة معالج تسجيل الدخول الخاصة بي (مباشرة من أمثلة Tornado) التي تعمل حاليًا مع Google OpenID/OAUTH:

class AuthLoginHandler(BaseHandler, tornado.auth.GoogleMixin):
    @tornado.web.asynchronous
    def get(self):

        if self.get_argument('openid.mode', None):
            self.get_authenticated_user(self.async_callback(self._on_auth))
            return

        ## redirect after auth
        self.authenticate_redirect()

    def _on_auth(self, user):
        ## auth fail
        if not user:
            raise tornado.web.HTTPError(500, 'Google auth failed')

        ## auth success
        identity = self.get_argument('openid.identity', None)

        ## set identity in cookie
        self.set_secure_cookie('identity', tornado.escape.json_encode(identity))
        self.redirect('/')

نقدر أي اقتراحات لحل ما. شكرًا

هل كانت مفيدة؟

المحلول

أعتقد أن أسهل طريقة للقيام بذلك هي تغيير AuthloginHandler إلى شيء أكثر تحديداً ، مثل GoogleauthHandler ، وإنشاء طريق مناسب لذلك:

(r"/login/google/", GoogleAuthHandler),
(r"/login/facebook/", FacebookAuthHandler),

إلخ.

ثم ببساطة إنشاء روابط لكل مزود مصادقة على الصفحة ala:

<a href="/login/google/>Login with Google</a>
<a href="/login/facebook/">Login with Facebook</a>

إذا كنت ترغب في جعلها مربوًا ، فيمكنك تزويد مقدمي الخدمات كمربع محدد ، أو إذا كنت ترغب في الحصول على خيال حقًا ، فيمكنك تحليل عنوان URL "OpenId" (على سبيل المثال ، إذا كان username.google.com ، self.redirect (" / تسجيل الدخول / Google ") ، لكن هذا يفترض أن المستخدمين يعرفون عناوين URL الخاصة بالمزود المفتوح ، وهو أمر غير صحيح عادةً. أعتقد أنه إذا أعطيتهم أيقونة Google / Facebook / Twitter أو شيء للنقر فوقه ، فإنه من شأنه أن يربك أقل ما يخلط بينهم عدد الاشخاص.

نصائح أخرى

لقد جئت إلى هذه المشكلة بنفسي ولكن في ظرف مختلف قليلاً.

أحد الحلول هو في الواقع أن تفعل شيئًا كهذا.

class AuthLoginHandler(BaseHandler, tornado.auth.GoogleMixin, tornado.auth.TwitterMixin):

    def get(self):
        if want_google:
            tornado.auth.GoogleMixin.get_authenticated_user(self)
            #...
        elif want_twitter:
            tornado.auth.TwitterMixin.get_authenticated_user(self)
        #...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top