8

Tornado を使い始めたばかりで、複数の認証方法を提供したいと考えています。現在、私のアプリは tornado.auth.GoogleMixin を使用して Google のハイブリッド OpenID/oAuth で正常に動作しており、認証されていないユーザーは自動的に Google の認証ページに送信されます。

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

デコレーター「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('/')

解決策の提案をお待ちしております。ありがとう

4

2 に答える 2

11

最も簡単な方法は、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 を知っていることを前提としていますが、通常はそうではありません。google / facebook / twitter アイコンまたはクリックするものをユーザーに与えれば、混乱を最小限に抑えることができると思います。人々の数。

于 2010-10-11T00:49:02.440 に答える
0

私は自分でこの問題に遭遇しましたが、少し異なる状況でした。

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)
        #...
于 2011-04-01T02:28:26.177 に答える