任何人都可以指出一个完整的示例,使用OAuth2和Flask对Google帐户进行身份验证,而不是在App Engine上进行身份验证吗?
我正在尝试让用户访问Google日历,然后使用该访问权限从日历中检索信息并进一步处理 . 我还需要存储并稍后刷新OAuth2令牌 .
我查看了Google的oauth2client库并且可以开始跳舞以检索授权代码,但是我知道我需要请求刷新令牌和访问令牌,但库中提供的示例适用于App仅限引擎和Django .
我也尝试使用包含对OAuth2的引用的Flask's OAuth module,但我也没有办法在那里交换授权代码 .
我可以手动编写请求代码,但更愿意使用或改编现有的python模块,使请求变得简单,正确处理可能的响应,甚至可以帮助存储令牌 .
有这样的事吗?
8 回答
另一个答案提到Flask-Rauth,但没有详细说明如何使用它 . 有一些谷歌特定的陷阱,但我最终实现了它,它运作良好 . 我将它与Flask-Login集成,因此我可以使用像
@login_required
这样的有用糖来装饰我的观点 .我希望能够支持多个OAuth2提供商,因此部分代码是通用的,并且基于Miguel Grinberg关于通过Facebook和Twitter支持OAuth2的优秀帖子here .
首先,将您的Google特定Google身份验证信息添加到您应用的配置中:
当你创建你的应用程序时(在我的情况下,模块的
__init__.py
):在您的app模块中,创建
auth.py
:这将创建一个可以进行子类化的通用
OAuthSignIn
类 . Google子类从Google发布的信息列表中提取信息(采用JSON格式here) . 这是可以更改的信息,因此这种方法将确保它始终是最新的 . 这样做的一个限制是,如果在初始化Flask应用程序(导入模块)时服务器上没有Internet连接,则无法正确实例化 . 这几乎不应该是一个问题,但在配置数据库中存储最后已知的值以涵盖这种可能性是一个好主意 .最后,该类在
callback()
函数中返回name, email
的元组 . Google实际上会返回更多信息,包括Google Profiles (如果有) . 检查oauth_session.get('').json()
返回的字典以查看全部内容 . 如果在authorize()
功能中扩展了范围(对于我的应用,email
就足够了),您可以通过Google API访问更多信息 .接下来,写下 views 将它们绑在一起:
最后,我的
/login
视图和模板使这一切成为现实:的login.html:
确保向Google注册了正确的回叫地址,用户只需在登录页面上点击“使用Google登录”,即可注册并登录 .
我没有听起来那么难 . 基本上你需要遵循https://developers.google.com/accounts/docs/OAuth2WebServer指南,就是这样 . 为此,您还需要在https://code.google.com/apis/console/注册以生成凭据并注册您的链接 . 我使用简单的子域指向我的办公室IP,因为它只允许域 .
对于用户登录/管理和会话,我使用了这个插件来烧瓶http://packages.python.org/Flask-Login/ - 会有一些基于此的代码 .
首先是第一件事 - 索引视图:
所以在我们将验证用户之前,此视图不会打开 . 谈论用户 - 用户模型:
UserMixin可能有问题,但我会处理后者 . 您的用户模型看起来会有所不同,只需使其与flask-login兼容即可 .
那么剩下的就是 - 自我认证 . 我为
flask-login
设置了登录视图'login'
.Login
视图使用登录按钮呈现html,指向谷歌 - 谷歌重定向到Auth
视图 . 如果只是登录用户的网站,应该可以将用户重定向到谷歌 .因此,所有内容都分为两部分 - 一部分用于获取
_get_token
中的Google令牌 . 其他用于在_get_data
中使用它并检索基本用户数据 .我的设置文件包含:
请记住,视图必须附加url路径到应用程序,所以我使用这个
urls.py
文件,以便我可以更轻松地跟踪我的视图,并导入更少的东西到烧瓶应用程序创建文件:所有这些共同使得在Flask中使用Google授权 . 如果你复制粘贴它 - 它可能需要一些修补瓶登录文档和SQLAlchemy映射,但这个想法就在那里 .
试试Authomatic(我是该项目的维护者) . 它使用起来非常简单,适用于 any Python framework 并支持 16 OAuth 2.0 , 10 OAuth 1.0a 提供程序和 OpenID .
以下是有关如何使用Google和 get his/her list of YouTube videos 对用户进行身份验证的简单示例:
还有一个非常简单的Flask tutorial,它显示了如何通过Facebook和Twitter对用户进行身份验证,并与他们的API通信以阅读用户的新闻源 .
Flask-Dance是一个将Flask,Requests和OAuthlib链接在一起的新库 . 它有一个漂亮的API,它内置支持Google auth,along with a quickstart for how to get started . 试试看!
Flask-oauth可能是你现在最好的选择,因为我知道它不支持令牌刷新,但它可以与Facebook一起使用,我们使用它并且它是oauth 2.如果它不需要特定于烧瓶,你可能会看看request-oauth
看起来新模块Flask-Rauth就是这个问题的答案:
见:Flask-Rauth
不专门针对谷歌 - https://github.com/lepture/flask-oauthlib,它有一个如何在https://github.com/lepture/example-oauth2-server实现客户端和服务器的示例
由于oauth2client现已弃用,我建议蓝色建议 . Bruno Rocha's model OAuth2 Flask中的Google身份验证是使用lepture强大的Flask-OAuthlib(pip-installable)的一个很好的起点 . 我建议模仿,然后扩展以满足您的需求 .