该模块包含各种第三方身份验证方案的实现。
此文件中的所有类都是类混合,旨在与 tornado.web.RequestHandler
类一起使用。 它们以两种方式使用:
在登录处理程序上,使用 authenticate_redirect()
、authorize_redirect()
和 get_authenticated_user()
等方法来建立用户身份并将身份验证令牌存储到您的数据库或 cookie。
在非登录处理程序中,使用 facebook_request()
或 twitter_request()
等方法使用身份验证令牌向相应服务发出请求。
由于所有这些服务实现身份验证和授权的方式略有不同,因此它们的方法都略有不同。
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"})
这些类实现了 OpenID 和 OAuth 标准。 通常需要对它们进行子类化才能将它们用于任何特定站点。 所需的定制程度会有所不同,但在大多数情况下,覆盖类属性(由于历史原因,这些属性以下划线开头)就足够了。
OpenID 和属性交换的抽象实现。
类属性:
_OPENID_ENDPOINT
:提供身份的 URI。
重定向到此服务的身份验证 URL。
身份验证后,服务将重定向回给定的回调 URI,并带有其他参数,包括 openid.mode
。
默认情况下,我们为经过身份验证的用户请求给定的属性(姓名、电子邮件、语言和用户名)。 如果您的应用不需要所有这些属性,则可以使用 ax_attrs
关键字参数请求更少。
在 6.0 版更改: callback
参数已删除,此方法不再返回可等待对象。 它现在是一个普通的同步函数。
返回要用于身份验证请求的 AsyncHTTPClient
实例。
可以被子类覆盖以使用默认值以外的 HTTP 客户端。
在重定向时获取经过身份验证的用户数据。
这个方法应该由从authenticate_redirect()
方法接收重定向的处理程序调用(这通常与调用它的方法相同;在这种情况下,如果openid.mode
参数存在则调用 get_authenticated_user
,如果不存在则调用 authenticate_redirect
。
这个方法的结果一般会被用来设置一个cookie
。
在 6.0 版更改: callback
参数已删除。 请改用返回的可等待对象。
OAuth 1.0 和 1.0a 的抽象实现。
类属性:
_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
方法。
重定向用户以获取此服务的 OAuth 授权。
如果您之前已向第三方服务注册了回调 URI,则可以省略 callback_uri
。 对于某些服务,您必须使用之前注册的回调 URI,并且不能通过此方法指定回调。
此方法设置一个名为 _oauth_request_token
的 cookie,随后出于安全目的在 get_authenticated_user
中使用(并清除)该 cookie。
此方法是异步的,必须使用 await
或 yield
调用(这与此模块中定义的其他 auth*_redirect
方法不同)。 它会为您调用 RequestHandler.finish
,因此您不应在它返回后编写任何其他响应。
在 3.1 版更改: 现在返回一个 Future
并接受一个可选的回调,以与 gen.coroutine
兼容。
在 6.0 版更改: callback
参数已删除。 请改用返回的可等待对象。
获取 OAuth 授权用户和访问令牌。
应从 OAuth 回调 URL 的处理程序调用此方法以完成注册过程。 我们使用经过身份验证的用户字典运行回调。 此字典将包含一个 access_key
,可用于代表用户向此服务发出授权请求。 字典还将包含其他字段,例如name
,具体取决于所使用的服务。
在 6.0 版更改: callback
参数已删除。 请改用返回的可等待对象。
子类必须覆盖它以返回其 OAuth 使用者密钥。
返回值应该是带有 key
和 secret
的字典。
子类必须覆盖它以获取有关用户的基本信息。
应该是一个协程,其结果是一个包含用户信息的字典,可能已通过使用 access_token
向服务发出请求来检索。
访问令牌将添加到返回的字典中以生成 get_authenticated_user
的结果。
在 5.1 版更改: 子类也可以使用 async def
定义此方法。
在 6.0 版更改:删除了对 _oauth_get_user
的同步回退。
返回要用于身份验证请求的 AsyncHTTPClient
实例。
可以被子类覆盖以使用默认值以外的 HTTP 客户端。
OAuth 2.0 的抽象实现。
类属性:
_OAUTH_AUTHORIZE_URL
:服务的授权 url。_OAUTH_ACCESS_TOKEN_URL
:服务的访问令牌 url。重定向用户以获取此服务的 OAuth 授权。
一些提供商要求您在应用程序中注册一个重定向 URL,而不是通过此方法传递一个。 您应该调用此方法使用户登录,然后在处理程序中为您的重定向 URL 调用 get_authenticated_user
以完成授权过程。
在 6.0 版更改: callback
参数和returned
的等待参数被删除; 现在这是一个普通的同步函数。
返回要用于身份验证请求的 AsyncHTTPClient
实例。
可以被子类覆盖以使用默认值以外的 HTTP 客户端。
获取给定的 URL 验证 OAuth2 访问令牌。
如果请求是 POST
,则应提供 post_args
。 查询字符串参数应作为关键字参数给出。
示例:
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!")
FastAPI提供了以下内容:基于开放标准用于创建 API 的OpenAPI包含了路径操作,请求参数,请求体,安全性等的声明。使用JSON Sche...
某些情况下,需要向客户端返回错误提示。这里所谓的客户端包括前端浏览器、其他应用程序、物联网设备等。需要向客户端返回错误提...
url_for()函数对于动态构建特定函数的URL非常有用。url_for()函数接受函数的名称作为第一个参数,以及一个或多个关键字参数,每...
缓存系统需要少量的设置。也就是说,你必须告诉它你的缓存数据应该放在哪里 —— 是在数据库中,还是在文件系统上,或者直接放在...
JRadioButtonMenuItem类表示可以包含在菜单中的复选框。选中菜单中的复选框可将控件的状态从打开更改为关闭或从关闭更改为打开。...
现在我们将应用简单的例子来一步一步教你如何使用 Junit。JUnit的一些注意事项:测试方法必须使用 @Test 修饰测试方法必须使用 p...
该功能依赖p6spy组件,完美的输出打印SQL及执行时长3.1.0以上版本示例工程:mybatis-plus-sample-crudp6spy依赖引入Maven:d...
MybatisX是一款基于IDEA的快速开发插件,为效率而生。安装方法:打开IDEA,进入File-Settings-Plugins-BrowseRepositories,输入...