該模塊包含各種第三方身份驗證方案的實現(xiàn)。
此文件中的所有類都是類混合,旨在與 ?tornado.web.RequestHandler
? 類一起使用。 它們以兩種方式使用:
在登錄處理程序上,使用 ?authenticate_redirect()
?、?authorize_redirect()
? 和 ?get_authenticated_user()
? 等方法來建立用戶身份并將身份驗證令牌存儲到您的數(shù)據(jù)庫或 cookie。
在非登錄處理程序中,使用 ?facebook_request()
? 或 ?twitter_request()
? 等方法使用身份驗證令牌向相應服務發(fā)出請求。
由于所有這些服務實現(xiàn)身份驗證和授權的方式略有不同,因此它們的方法都略有不同。
Google OAuth 的示例用法:
class GoogleOAuth2LoginHandler(tornado.web.RequestHandler,
tornado.auth.GoogleOAuth2Mixin):
async def get(self):
if self.get_argument('code', False):
user = await self.get_authenticated_user(
redirect_uri='http://your.site.com/auth/google',
code=self.get_argument('code'))
# Save the user with e.g. set_secure_cookie
else:
self.authorize_redirect(
redirect_uri='http://your.site.com/auth/google',
client_id=self.settings['google_oauth']['key'],
scope=['profile', 'email'],
response_type='code',
extra_params={'approval_prompt': 'auto'})
這些類實現(xiàn)了 OpenID 和 OAuth 標準。 通常需要對它們進行子類化才能將它們用于任何特定站點。 所需的定制程度會有所不同,但在大多數(shù)情況下,覆蓋類屬性(由于歷史原因,這些屬性以下劃線開頭)就足夠了。
OpenID 和屬性交換的抽象實現(xiàn)。
類屬性:
?_OPENID_ENDPOINT
?:提供身份的 URI。
重定向到此服務的身份驗證 URL。
身份驗證后,服務將重定向回給定的回調(diào) URI,并帶有其他參數(shù),包括 ?openid.mode
?。
默認情況下,我們?yōu)榻?jīng)過身份驗證的用戶請求給定的屬性(姓名、電子郵件、語言和用戶名)。 如果您的應用不需要所有這些屬性,則可以使用 ?ax_attrs
關鍵字參數(shù)請求更少。
在 6.0 版更改: ?callback
?參數(shù)已刪除,此方法不再返回可等待對象。 它現(xiàn)在是一個普通的同步函數(shù)。
返回要用于身份驗證請求的 ?AsyncHTTPClient
實例。
可以被子類覆蓋以使用默認值以外的 HTTP 客戶端。
在重定向時獲取經(jīng)過身份驗證的用戶數(shù)據(jù)。
這個方法應該由從?authenticate_redirect()
?方法接收重定向的處理程序調(diào)用(這通常與調(diào)用它的方法相同;在這種情況下,如果?openid.mode
?參數(shù)存在則調(diào)用 ?get_authenticated_user
?,如果不存在則調(diào)用 ?authenticate_redirect
?。
這個方法的結果一般會被用來設置一個?cookie
?。
在 6.0 版更改: ?callback
?參數(shù)已刪除。 請改用返回的可等待對象。
OAuth 1.0 和 1.0a 的抽象實現(xiàn)。
類屬性:
_OAUTH_AUTHORIZE_URL
?:服務的 OAuth 授權 URL。_OAUTH_ACCESS_TOKEN_URL
?:服務的 OAuth 訪問令牌 url。_OAUTH_VERSION
?:可以是“1.0”或“1.0a”。_OAUTH_NO_CALLBACKS
?:如果服務需要提前注冊回調(diào),則將此設置為 True。子類還必須覆蓋 ?_oauth_get_user_future
?和 ?_oauth_consumer_token
方法。
重定向用戶以獲取此服務的 OAuth 授權。
如果您之前已向第三方服務注冊了回調(diào) URI,則可以省略 ?callback_uri
?。 對于某些服務,您必須使用之前注冊的回調(diào) URI,并且不能通過此方法指定回調(diào)。
此方法設置一個名為 ?_oauth_request_token
?的 cookie,隨后出于安全目的在 ?get_authenticated_user
中使用(并清除)該 cookie。
此方法是異步的,必須使用 ?await
或 ?yield
調(diào)用(這與此模塊中定義的其他 ?auth*_redirect
? 方法不同)。 它會為您調(diào)用 ?RequestHandler.finish
?,因此您不應在它返回后編寫任何其他響應。
在 3.1 版更改: 現(xiàn)在返回一個 ?Future
并接受一個可選的回調(diào),以與 ?gen.coroutine
? 兼容。
在 6.0 版更改: ?callback
?參數(shù)已刪除。 請改用返回的可等待對象。
獲取 OAuth 授權用戶和訪問令牌。
應從 OAuth 回調(diào) URL 的處理程序調(diào)用此方法以完成注冊過程。 我們使用經(jīng)過身份驗證的用戶字典運行回調(diào)。 此字典將包含一個 ?access_key
?,可用于代表用戶向此服務發(fā)出授權請求。 字典還將包含其他字段,例如?name
?,具體取決于所使用的服務。
在 6.0 版更改: ?callback
?參數(shù)已刪除。 請改用返回的可等待對象。
子類必須覆蓋它以返回其 OAuth 使用者密鑰。
返回值應該是帶有 ?key
? 和 ?secret
?的字典。
子類必須覆蓋它以獲取有關用戶的基本信息。
應該是一個協(xié)程,其結果是一個包含用戶信息的字典,可能已通過使用 ?access_token
向服務發(fā)出請求來檢索。
訪問令牌將添加到返回的字典中以生成 ?get_authenticated_user
的結果。
在 5.1 版更改: 子類也可以使用 ?async def
定義此方法。
在 6.0 版更改:刪除了對 ?_oauth_get_user
? 的同步回退。
返回要用于身份驗證請求的 ?AsyncHTTPClient
實例。
可以被子類覆蓋以使用默認值以外的 HTTP 客戶端。
OAuth 2.0 的抽象實現(xiàn)。
類屬性:
_OAUTH_AUTHORIZE_URL
?:服務的授權 url。_OAUTH_ACCESS_TOKEN_URL
?:服務的訪問令牌 url。重定向用戶以獲取此服務的 OAuth 授權。
一些提供商要求您在應用程序中注冊一個重定向 URL,而不是通過此方法傳遞一個。 您應該調(diào)用此方法使用戶登錄,然后在處理程序中為您的重定向 URL 調(diào)用 ?get_authenticated_user
以完成授權過程。
在 6.0 版更改: ?callback
?參數(shù)和?returned
?的等待參數(shù)被刪除; 現(xiàn)在這是一個普通的同步函數(shù)。
返回要用于身份驗證請求的 ?AsyncHTTPClient
實例。
可以被子類覆蓋以使用默認值以外的 HTTP 客戶端。
獲取給定的 URL 驗證 OAuth2 訪問令牌。
如果請求是 ?POST
?,則應提供 ?post_args
?。 查詢字符串參數(shù)應作為關鍵字參數(shù)給出。
示例:
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!")
更多建議: