tornado.auth — OpenIDおよびOAuthによるサードパーティログイン

このモジュールには、さまざまなサードパーティ認証スキームの実装が含まれています。

このファイル内のすべてのクラスは、tornado.web.RequestHandlerクラスで使用することを目的としたクラスミキシンです。これらは2つの方法で使用されます。

  • ログインハンドラーでは、authenticate_redirect()authorize_redirect()get_authenticated_user()などのメソッドを使用して、ユーザーのIDを確立し、認証トークンをデータベースやクッキーに保存します。

  • ログイン以外のハンドラーでは、facebook_request()またはtwitter_request()などのメソッドを使用して、認証トークンを使用してそれぞれのサービスにリクエストを行います。

これらのサービスはすべて認証と認可をわずかに異なる方法で実装しているため、すべてわずかに異なる引数を取ります。完全なドキュメントについては、以下の個々のサービスクラスを参照してください。

Google OAuthの使用例

class GoogleOAuth2LoginHandler(tornado.web.RequestHandler,
                                tornado.auth.GoogleOAuth2Mixin):
    async def get(self):
        # Google requires an exact match for redirect_uri, so it's
        # best to get it from your app configuration instead of from
        # self.request.full_uri().
        redirect_uri = urllib.parse.urljoin(self.application.settings['redirect_base_uri'],
            self.reverse_url('google_oauth'))
        async def get(self):
            if self.get_argument('code', False):
                access = await self.get_authenticated_user(
                    redirect_uri=redirect_uri,
                    code=self.get_argument('code'))
                user = await self.oauth2_request(
                    "https://www.googleapis.com/oauth2/v1/userinfo",
                    access_token=access["access_token"])
                # Save the user and access token. For example:
                user_cookie = dict(id=user["id"], access_token=access["access_token"])
                self.set_signed_cookie("user", json.dumps(user_cookie))
                self.redirect("/")
            else:
                self.authorize_redirect(
                    redirect_uri=redirect_uri,
                    client_id=self.get_google_oauth_settings()['key'],
                    scope=['profile', 'email'],
                    response_type='code',
                    extra_params={'approval_prompt': 'auto'})

共通のプロトコル

これらのクラスは、OpenIDおよびOAuth標準を実装しています。一般的に、特定のサイトで使用するにはサブクラス化する必要があります。必要なカスタマイズの程度は異なりますが、ほとんどの場合、クラス属性(歴史的な理由からアンダースコアで始まる名前が付けられています)をオーバーライドするだけで十分です。

class tornado.auth.OpenIdMixin[source]

OpenIDと属性交換の抽象実装。

クラス属性

  • _OPENID_ENDPOINT: アイデンティティプロバイダーのURI。

authenticate_redirect(callback_uri: Optional[str] = None, ax_attrs: List[str] = ['name', 'email', 'language', 'username']) None[source]

このサービスの認証URLにリダイレクトします。

認証後、サービスはopenid.modeを含む追加のパラメーターを使用して、指定されたコールバックURIにリダイレクトします。

デフォルトでは、認証済みユーザーの指定された属性(名前、メール、言語、ユーザー名)をリクエストします。アプリですべての属性を必要としない場合は、ax_attrsキーワード引数で少ない属性をリクエストできます。

バージョン6.0で変更: callback引数が削除され、このメソッドは非同期オブジェクトを返すことができなくなりました。通常の同期関数になりました。

coroutine get_authenticated_user(http_client: Optional[AsyncHTTPClient] = None) Dict[str, Any][source]

リダイレクト時に認証済みユーザーデータを取得します。

このメソッドは、authenticate_redirect()メソッドからのリダイレクトを受け取るハンドラーによって呼び出される必要があります(多くの場合、それを呼び出すものと同じです。その場合、openid.modeパラメーターが存在する場合はget_authenticated_userを、存在しない場合はauthenticate_redirectを呼び出します)。

このメソッドの結果は、一般的にクッキーの設定に使用されます。

バージョン6.0で変更: callback引数が削除されました。代わりに返された非同期オブジェクトを使用してください。

get_auth_http_client() AsyncHTTPClient[source]

認証リクエストに使用されるAsyncHTTPClientインスタンスを返します。

サブクラスでオーバーライドして、デフォルト以外のHTTPクライアントを使用できます。

class tornado.auth.OAuthMixin[source]

OAuth 1.0および1.0aの抽象実装。

例として、以下のTwitterMixinを参照してください。

クラス属性

  • _OAUTH_AUTHORIZE_URL: サービスのOAuth認証URL。

  • _OAUTH_ACCESS_TOKEN_URL: サービスのOAuthアクセストークンURL。

  • _OAUTH_VERSION: "1.0"または"1.0a"のいずれかです。

  • _OAUTH_NO_CALLBACKS: サービスがコールバックの事前登録を必要とする場合、これをTrueに設定します。

サブクラスは、_oauth_get_user_futureメソッドと_oauth_consumer_tokenメソッドもオーバーライドする必要があります。

async authorize_redirect(callback_uri: Optional[str] = None, extra_params: Optional[Dict[str, Any]] = None, http_client: Optional[AsyncHTTPClient] = None) None[source]

このサービスのOAuth認証を取得するために、ユーザーをリダイレクトします。

サードパーティサービスにコールバックURIを事前に登録済みの場合は、callback_uriを省略できます。ただし、一部のサービスでは、事前に登録されたコールバックURIを使用する必要があり、このメソッドでコールバックを指定することはできません。

このメソッドは_oauth_request_tokenというCookieを設定します。これは、セキュリティ上の目的で、get_authenticated_userで後続で使用され(そしてクリアされます)。

このメソッドは非同期であり、awaitまたはyieldを使用して呼び出す必要があります(これは、このモジュールで定義されている他のauth*_redirectメソッドとは異なります)。このメソッドはRequestHandler.finishを呼び出すため、返した後には他のレスポンスを書き込まないでください。

バージョン3.1で変更: Futureを返し、オプションのコールバックを受け取るようになりました。gen.coroutineとの互換性のためです。

バージョン6.0で変更: callback引数が削除されました。代わりに返された非同期オブジェクトを使用してください。

async get_authenticated_user(http_client: Optional[AsyncHTTPClient] = None) Dict[str, Any][source]

OAuthで認証されたユーザーとアクセストークンを取得します。

このメソッドは、登録プロセスを完了するために、OAuthコールバックURLのハンドラーから呼び出す必要があります。認証されたユーザーの辞書を使用してコールバックを実行します。この辞書には、ユーザーに代わってこのサービスへの承認済みリクエストを行うために使用できるaccess_keyが含まれます。また、使用されるサービスに応じて、nameなどの他のフィールドも含まれます。

バージョン6.0で変更: callback引数が削除されました。代わりに返された非同期オブジェクトを使用してください。

_oauth_consumer_token() Dict[str, Any][source]

サブクラスでは、OAuthコンシューマーキーを返すようにこれをオーバーライドする必要があります。

戻り値は、keysecretというキーを持つdictである必要があります。

async _oauth_get_user_future(access_token: Dict[str, Any]) Dict[str, Any][source]

ユーザーに関する基本情報を取得するために、サブクラスでこれをオーバーライドする必要があります。

結果は、サービスへのリクエストを行うためにaccess_tokenを使用して取得された可能性のある、ユーザーに関する情報を含む辞書であるコルーチンである必要があります。

アクセストークンは、get_authenticated_userの結果を作成するために、返される辞書に追加されます。

バージョン5.1で変更: サブクラスでは、async defを使用してこのメソッドを定義することもできます。

バージョン6.0で変更: _oauth_get_userへの同期的なフォールバックが削除されました。

get_auth_http_client() AsyncHTTPClient[source]

認証リクエストに使用されるAsyncHTTPClientインスタンスを返します。

サブクラスでオーバーライドして、デフォルト以外のHTTPクライアントを使用できます。

class tornado.auth.OAuth2Mixin[source]

OAuth 2.0の抽象的な実装です。

例としての実装については、下記のFacebookGraphMixinまたはGoogleOAuth2Mixinを参照してください。

クラス属性

  • _OAUTH_AUTHORIZE_URL: サービスの認可URL。

  • _OAUTH_ACCESS_TOKEN_URL: サービスのアクセストークンURL。

authorize_redirect(redirect_uri: Optional[str] = None, client_id: Optional[str] = None, client_secret: Optional[str] = None, extra_params: Optional[Dict[str, Any]] = None, scope: Optional[List[str]] = None, response_type: str = 'code') None[source]

このサービスのOAuth認証を取得するために、ユーザーをリダイレクトします。

一部のプロバイダでは、このメソッドを介してリダイレクトURLを渡す代わりに、アプリケーションにリダイレクトURLを登録する必要があります。ユーザーのログインにはこのメソッドを呼び出し、その後、認可プロセスを完了するために、リダイレクトURLのハンドラーでget_authenticated_userを呼び出す必要があります。

バージョン6.0で変更: callback引数と返されるawaitableは削除されました。これは、通常の同期関数になりました。

バージョン6.4で非推奨: client_secret引数(これまで効果がなかった)は非推奨となり、Tornado 7.0で削除される予定です。

coroutine oauth2_request(url: str, access_token: Optional[str] = None, post_args: Optional[Dict[str, Any]] = None, **args: Any) Any[source]

OAuth2アクセストークンを使用して、指定されたURLを取得します。

リクエストがPOSTの場合、post_argsを指定する必要があります。クエリ文字列引数はキーワード引数として指定してください。

使用例

..testcode

class MainHandler(tornado.web.RequestHandler,
                  tornado.auth.FacebookGraphMixin):
    @tornado.web.authenticated
    async def get(self):
        new_entry = await self.oauth2_request(
            "https://graph.facebook.com/me/feed",
            post_args={"message": "I am posting from my Tornado application!"},
            access_token=self.current_user["access_token"])

        if not new_entry:
            # Call failed; perhaps missing permission?
            self.authorize_redirect()
            return
        self.finish("Posted a message!")

バージョン4.3で追加。

get_auth_http_client() AsyncHTTPClient[source]

認証リクエストに使用されるAsyncHTTPClientインスタンスを返します。

サブクラスでオーバーライドして、デフォルト以外のHTTPクライアントを使用できます。

バージョン4.3で追加。

Google

class tornado.auth.GoogleOAuth2Mixin[source]

OAuth2を使用したGoogle認証。

使用する際には、Googleにアプリケーションを登録し、関連パラメーターをアプリケーション設定にコピーしてください。

  • Google開発者コンソール(http://console.developers.google.com)にアクセスしてください。

  • プロジェクトを選択するか、新規作成します。

  • 必要な権限に応じて、アプリケーションを「テスト」モードに設定し、アカウントをテストユーザーとして追加するか、検証プロセスを実行する必要があります。「APIとサービスの有効化」コマンドを使用して、特定のサービスを有効化する必要がある場合もあります。

  • 左側のサイドバーで、「認証情報」を選択します。

  • 「認証情報の作成」をクリックし、「OAuthクライアントID」をクリックします。

  • 「アプリケーションの種類」で「ウェブアプリケーション」を選択します。

  • OAuth 2.0クライアントに名前を付けて、「作成」をクリックします。

  • 「クライアントシークレット」と「クライアントID」をアプリケーション設定に{"google_oauth": {"key": CLIENT_ID, "secret": CLIENT_SECRET}}としてコピーします。

  • このクラスで使用する予定のredirect_uriを、「認証情報」ページに登録する必要があります。

バージョン3.2で追加。

get_google_oauth_settings() Dict[str, str][source]

[Google Cloud Platform](https://console.cloud.google.com/apis/credentials)で作成したGoogle OAuth 2.0認証情報を返します。辞書の形式は

{
    "key": "your_client_id", "secret": "your_client_secret"
}

認証情報が異なる方法(例:データベース)に保存されている場合は、このメソッドをオーバーライドしてカスタムプロビジョニングを行うことができます。

コルーチン get_authenticated_user(redirect_uri: str, code: str, client_id: Optional[str] = None, client_secret: Optional[str] = None) Dict[str, Any][source]

Googleユーザーのログインを処理し、アクセストークンを返します。

結果は、access_tokenフィールド([その他](https://developers.google.com/identity/protocols/OAuth2WebServer#handlingtheresponse)を含む)を含む辞書です。このパッケージの他のget_authenticated_userメソッドとは異なり、このメソッドはユーザーに関する追加情報を返しません。返されたアクセストークンは、OAuth2Mixin.oauth2_requestと共に使用して、追加情報(おそらくhttps://www.googleapis.com/oauth2/v2/userinfoから)を要求できます。

使用例

class GoogleOAuth2LoginHandler(tornado.web.RequestHandler,
                               tornado.auth.GoogleOAuth2Mixin):
    async def get(self):
        # Google requires an exact match for redirect_uri, so it's
        # best to get it from your app configuration instead of from
        # self.request.full_uri().
        redirect_uri = urllib.parse.urljoin(self.application.settings['redirect_base_uri'],
            self.reverse_url('google_oauth'))
        async def get(self):
            if self.get_argument('code', False):
                access = await self.get_authenticated_user(
                    redirect_uri=redirect_uri,
                    code=self.get_argument('code'))
                user = await self.oauth2_request(
                    "https://www.googleapis.com/oauth2/v1/userinfo",
                    access_token=access["access_token"])
                # Save the user and access token. For example:
                user_cookie = dict(id=user["id"], access_token=access["access_token"])
                self.set_signed_cookie("user", json.dumps(user_cookie))
                self.redirect("/")
            else:
                self.authorize_redirect(
                    redirect_uri=redirect_uri,
                    client_id=self.get_google_oauth_settings()['key'],
                    scope=['profile', 'email'],
                    response_type='code',
                    extra_params={'approval_prompt': 'auto'})

バージョン6.0で変更: callback引数が削除されました。代わりに返された非同期オブジェクトを使用してください。

Facebook

class tornado.auth.FacebookGraphMixin[source]

新しいGraph APIとOAuth2を使用したFacebook認証。

コルーチン get_authenticated_user(redirect_uri: str, client_id: str, client_secret: str, code: str, extra_fields: Optional[Dict[str, Any]] = None) Optional[Dict[str, Any]][source]

Facebookユーザーのログインを処理し、ユーザーオブジェクトを返します。

使用例

class FacebookGraphLoginHandler(tornado.web.RequestHandler,
                                tornado.auth.FacebookGraphMixin):
  async def get(self):
    redirect_uri = urllib.parse.urljoin(
        self.application.settings['redirect_base_uri'],
        self.reverse_url('facebook_oauth'))
    if self.get_argument("code", False):
        user = await self.get_authenticated_user(
            redirect_uri=redirect_uri,
            client_id=self.settings["facebook_api_key"],
            client_secret=self.settings["facebook_secret"],
            code=self.get_argument("code"))
        # Save the user with e.g. set_signed_cookie
    else:
        self.authorize_redirect(
            redirect_uri=redirect_uri,
            client_id=self.settings["facebook_api_key"],
            extra_params={"scope": "user_posts"})

このメソッドは、以下のフィールドを含む可能性のある辞書を返します。

  • access_token: facebook_requestに渡すことができる文字列。

  • session_expires: アクセストークンの有効期限までの時間を秒単位で表す、文字列としてエンコードされた整数。このフィールドはint(user['session_expires'])のように使用する必要があります。Tornadoの将来のバージョンでは、文字列から整数に変更される可能性があります。

  • idnamefirst_namelast_namelocalepicturelink、およびextra_fields引数で指定されたフィールド。これらのフィールドは、Facebook Graph APIのユーザーオブジェクトからコピーされます。

バージョン 4.5 で変更されました: session_expiresフィールドは、2017年3月にFacebook APIに加えられた変更に対応するために更新されました。

バージョン6.0で変更: callback引数が削除されました。代わりに返された非同期オブジェクトを使用してください。

コルーチン facebook_request(path: str, access_token: Optional[str] = None, post_args: Optional[Dict[str, Any]] = None, **args: Any) Any[source]

指定された相対APIパス(例:「/btaylor/picture」)を取得します。

リクエストがPOSTの場合、post_argsを指定する必要があります。クエリ文字列引数はキーワード引数として指定してください。

Facebook Graph APIの概要は、http://developers.facebook.com/docs/apiを参照してください。

多くのメソッドはOAuthアクセストークンを必要とします。これは、authorize_redirectget_authenticated_userを通して取得できます。このプロセスを通じて返されるユーザーオブジェクトには、access_token属性が含まれており、このメソッドを介して認証済みのリクエストを行うために使用できます。

使用例

class MainHandler(tornado.web.RequestHandler,
                  tornado.auth.FacebookGraphMixin):
    @tornado.web.authenticated
    async def get(self):
        new_entry = await self.facebook_request(
            "/me/feed",
            post_args={"message": "I am posting from my Tornado application!"},
            access_token=self.current_user["access_token"])

        if not new_entry:
            # Call failed; perhaps missing permission?
            self.authorize_redirect()
            return
        self.finish("Posted a message!")

指定されたパスは、self._FACEBOOK_BASE_URLを基準とした相対パスです。デフォルトでは「https://graph.facebook.com」です。

このメソッドはOAuth2Mixin.oauth2_requestのラッパーです。唯一の違いは、このメソッドが相対パスを受け取るのに対し、oauth2_requestは完全なURLを受け取る点です。

バージョン3.1での変更: self._FACEBOOK_BASE_URLを上書きする機能が追加されました。

バージョン6.0で変更: callback引数が削除されました。代わりに返された非同期オブジェクトを使用してください。

Twitter

class tornado.auth.TwitterMixin[source]

Twitter OAuth認証。

Twitterで認証するには、http://twitter.com/appsでアプリケーションを登録します。次に、コンシューマーキーとコンシューマーシークレットをアプリケーションのsettingstwitter_consumer_keytwitter_consumer_secretにコピーします。アプリケーションのコールバックURLとして登録したURLのハンドラーでこのmixinを使用します。

アプリケーションの設定が完了したら、このmixinを使用してユーザーをTwitterで認証し、ストリームへのアクセスを取得できます。

class TwitterLoginHandler(tornado.web.RequestHandler,
                          tornado.auth.TwitterMixin):
    async def get(self):
        if self.get_argument("oauth_token", None):
            user = await self.get_authenticated_user()
            # Save the user using e.g. set_signed_cookie()
        else:
            await self.authorize_redirect()

get_authenticated_userによって返されるユーザーオブジェクトには、usernamenameaccess_token属性と、https://dev.twitter.com/docs/api/1.1/get/users/showに記載されているすべてのカスタムTwitterユーザー属性が含まれています。

バージョン6.3から非推奨: このクラスは、Twitterによって非推奨となったTwitter APIバージョン1.1を参照しています。TwitterがAPIへのアクセスを制限し始めたため、このクラスは今後更新されなくなり、将来削除されます。

coroutine authenticate_redirect(callback_uri: Optional[str] = None) None[source]

authorize_redirectと同様ですが、承認された場合は自動的にリダイレクトします。

シングルサインオンにTwitterを使用する場合は、一般的にこのインターフェースを使用するのが適切です。

バージョン3.1で変更: Futureを返し、オプションのコールバックを受け取るようになりました。gen.coroutineとの互換性のためです。

バージョン6.0で変更: callback引数が削除されました。代わりに返された非同期オブジェクトを使用してください。

coroutine twitter_request(path: str, access_token: Dict[str, Any], post_args: Optional[Dict[str, Any]] = None, **args: Any) Any[source]

指定されたAPIパス(例:statuses/user_timeline/btaylor)を取得します。

パスには、フォーマットまたはAPIバージョン番号を含めないでください。(JSON形式とAPIバージョン1を自動的に使用します)。

リクエストがPOSTの場合、post_argsを指定する必要があります。クエリ文字列引数はキーワード引数として指定してください。

すべてのTwitterメソッドは、http://dev.twitter.com/で説明されています。

多くのメソッドはOAuthアクセストークンを必要とします。これは、authorize_redirectget_authenticated_userを通して取得できます。このプロセスを通じて返されるユーザーオブジェクトには「access_token」属性が含まれており、このメソッドを介して認証済みのリクエストを行うために使用できます。使用例

class MainHandler(tornado.web.RequestHandler,
                  tornado.auth.TwitterMixin):
    @tornado.web.authenticated
    async def get(self):
        new_entry = await self.twitter_request(
            "/statuses/update",
            post_args={"status": "Testing Tornado Web Server"},
            access_token=self.current_user["access_token"])
        if not new_entry:
            # Call failed; perhaps missing permission?
            await self.authorize_redirect()
            return
        self.finish("Posted a message!")

バージョン6.0で変更: callback引数が削除されました。代わりに返された非同期オブジェクトを使用してください。