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コンシューマーキーを返すようにこれをオーバーライドする必要があります。
戻り値は、
key
とsecret
というキーを持つ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の将来のバージョンでは、文字列から整数に変更される可能性があります。id
、name
、first_name
、last_name
、locale
、picture
、link
、および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_redirect
とget_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でアプリケーションを登録します。次に、コンシューマーキーとコンシューマーシークレットをアプリケーションの
settings
のtwitter_consumer_key
とtwitter_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
によって返されるユーザーオブジェクトには、username
、name
、access_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_redirect
とget_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
引数が削除されました。代わりに返された非同期オブジェクトを使用してください。