質問

Tornadoで遊んだばかりで、複数の認証方法を提供したいと考えています。現在、私のアプリは、Tornado.auth.googlemixinを使用してGoogleのHybrid OpenID/OAuthで正常に動作しており、認可されていないユーザーはGoogleのAUTHページに自動的に送信されます。

認証されていないユーザーが別のオプション(つまり、ローカルAUTHまたはTORNADO.AUTH.TWITTERMIXIN)を使用したい場合、ログインハンドラー内のAUTHメカニズムを選択するためにロジックを実装するにはどうすればよいですか?

デコレーター「Tornado.web.authenticated」をすべての露出した方法に追加しました。ここに、現在Google OpenID/OAuthで作業している私のログインハンドラークラス(Tornadoの例からほぼまっすぐ)があります。

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>

あなたがそれをよりファンにしたいなら、あなたはプロバイダーを選択ボックスとして提供することができます、またはあなたが本当に派手になりたいなら、あなたは彼らの「openid」URLを解析することができます(例:username.google.com、self.redirect( " / login / google ")、しかし、それはユーザーが自分のopenidプロバイダーのURLを知っていると仮定しますが、これは通常そうではありません。人々の数。

他のヒント

私は自分でこの問題に出会いましたが、わずかに異なる状況にあります。

1つの解決策は、実際にこのようなことをすることです。

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