Tornado 使用OpenID 和 OAuth的第三方登錄

2022-03-10 17:45 更新

該模塊包含各種第三方身份驗證方案的實現(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é)議

這些類實現(xiàn)了 OpenID 和 OAuth 標準。 通常需要對它們進行子類化才能將它們用于任何特定站點。 所需的定制程度會有所不同,但在大多數(shù)情況下,覆蓋類屬性(由于歷史原因,這些屬性以下劃線開頭)就足夠了。

class tornado.auth.OpenIdMixin

OpenID 和屬性交換的抽象實現(xiàn)。

類屬性:

?_OPENID_ENDPOINT?:提供身份的 URI。

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

重定向到此服務的身份驗證 URL。

身份驗證后,服務將重定向回給定的回調(diào) URI,并帶有其他參數(shù),包括 ?openid.mode?。

默認情況下,我們?yōu)榻?jīng)過身份驗證的用戶請求給定的屬性(姓名、電子郵件、語言和用戶名)。 如果您的應用不需要所有這些屬性,則可以使用 ?ax_attrs關鍵字參數(shù)請求更少。

在 6.0 版更改: ?callback?參數(shù)已刪除,此方法不再返回可等待對象。 它現(xiàn)在是一個普通的同步函數(shù)。

get_auth_http_client() → tornado.httpclient.AsyncHTTPClient

返回要用于身份驗證請求的 ?AsyncHTTPClient實例。

可以被子類覆蓋以使用默認值以外的 HTTP 客戶端。

coroutineget_authenticated_user(http_client: Optional[tornado.httpclient.AsyncHTTPClient] = None) → Dict[str, Any]

在重定向時獲取經(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ù)已刪除。 請改用返回的可等待對象。

class tornado.auth.OAuthMixin

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方法。

authorize_redirect(callback_uri: Optional[str] = None, extra_params: Optional[Dict[str, Any]] = None, http_client: Optional[tornado.httpclient.AsyncHTTPClient] = None) → None

重定向用戶以獲取此服務的 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ù)已刪除。 請改用返回的可等待對象。

get_authenticated_user(http_client: Optional[tornado.httpclient.AsyncHTTPClient] = None) → Dict[str, Any]

獲取 OAuth 授權用戶和訪問令牌。

應從 OAuth 回調(diào) URL 的處理程序調(diào)用此方法以完成注冊過程。 我們使用經(jīng)過身份驗證的用戶字典運行回調(diào)。 此字典將包含一個 ?access_key?,可用于代表用戶向此服務發(fā)出授權請求。 字典還將包含其他字段,例如?name?,具體取決于所使用的服務。

在 6.0 版更改: ?callback?參數(shù)已刪除。 請改用返回的可等待對象。

_oauth_consumer_token() → Dict[str, Any]

子類必須覆蓋它以返回其 OAuth 使用者密鑰。

返回值應該是帶有 ?key? 和 ?secret ?的字典。

_oauth_get_user_future(access_token: Dict[str, Any]) → Dict[str, Any]

子類必須覆蓋它以獲取有關用戶的基本信息。

應該是一個協(xié)程,其結果是一個包含用戶信息的字典,可能已通過使用 ?access_token向服務發(fā)出請求來檢索。

訪問令牌將添加到返回的字典中以生成 ?get_authenticated_user的結果。

在 5.1 版更改: 子類也可以使用 ?async def定義此方法。

在 6.0 版更改:刪除了對 ?_oauth_get_user? 的同步回退。

get_auth_http_client() → tornado.httpclient.AsyncHTTPClient

返回要用于身份驗證請求的 ?AsyncHTTPClient實例。

可以被子類覆蓋以使用默認值以外的 HTTP 客戶端。

class tornado.auth.OAuth2Mixin

OAuth 2.0 的抽象實現(xiàn)。

類屬性:

  • ?_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

重定向用戶以獲取此服務的 OAuth 授權。

一些提供商要求您在應用程序中注冊一個重定向 URL,而不是通過此方法傳遞一個。 您應該調(diào)用此方法使用戶登錄,然后在處理程序中為您的重定向 URL 調(diào)用 ?get_authenticated_user以完成授權過程。

在 6.0 版更改: ?callback?參數(shù)和?returned?的等待參數(shù)被刪除; 現(xiàn)在這是一個普通的同步函數(shù)。

get_auth_http_client() → tornado.httpclient.AsyncHTTPClient

返回要用于身份驗證請求的 ?AsyncHTTPClient實例。

可以被子類覆蓋以使用默認值以外的 HTTP 客戶端。

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

獲取給定的 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!")


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號