有人能给我一个完整的例子,使用OAuth2和Flask对Google帐户进行身份验证,而不是在应用引擎上进行身份验证吗?
我正在尝试让用户授予对Google日历的访问权限,然后使用该访问权限从日历中检索信息并进一步处理。我还需要存储OAuth2令牌,并在以后刷新。
我看过Google的oauth2client库,可以让dance开始检索授权码,但我有点迷失了。看了看Google的OAuth 2.0 Playground,我知道我需要请求刷新令牌和访问令牌,但库中提供的示例仅适用于App Engine和Django。
我也尝试过使用包含对OAuth2的引用的Flask's OAuth module,但是我也没有看到任何交换授权代码的方法。
我可能会手工编写请求,但更喜欢使用或修改现有的python模块,使请求更容易,正确处理可能的响应,甚至可能有助于存储令牌。
有这种事吗?
9条答案
按热度按时间rxztt3cl1#
另一个答案提到了Flask-Rauth,但没有详细说明如何使用它。有一些Google特有的陷阱,但我最终实现了它,它运行得很好。我将它与Flask-Login集成,这样我就可以用
@login_required
这样有用的糖来装饰我的视图。我希望能够支持多个OAuth2提供程序,因此部分代码是通用的,并基于Miguel Grinberg关于通过Facebook和Twitter here支持OAuth2的精彩帖子。
首先,将来自Google的特定Google身份验证信息添加到您的应用配置中:
当你创建你的应用程序时(在我的例子中,模块是
__init__.py
):在您的应用模块中,创建
auth.py
:这将创建一个可以子类化的泛型
OAuthSignIn
类。(JSON格式here)。这些信息可能会发生变化,因此这种方法将确保它始终是最新的。这样做的一个限制是,如果在初始化Flask应用程序时服务器上没有Internet连接(导入的模块),它将不会被正确示例化。这几乎不会是一个问题,但是在配置数据库中存储最后已知的值以应对这种可能性是一个好主意。最后,该类在
callback()
函数中返回一个name, email
元组。Google实际上返回了更多信息,包括Google+个人资料(如果有)。检查oauth_session.get('').json()
返回的字典可以看到所有信息。如果在authorize()
函数中扩展了作用域,(对于我的应用程序,email
就足够了),你可以通过Google API访问更多的信息。接下来,编写视图,将所有内容联系在一起:
最后,我的
/login
视图和模板可以实现这一切:login.html:
确保正确的回叫地址是注册与谷歌,用户应该只需点击“登录与谷歌”在您的登录页面上,它会注册他们,并登录他们。
kg7wmglp2#
我已经搜索了相当多关于使用不同的库,但他们似乎都有点矫枉过正(你可以在任何平台上使用它,但你需要吨的代码)或文档没有解释我想要什么。长话短说-我写了它从头开始,从而了解过程中的认证真正的谷歌API。它并不像它听起来那么难。基本上你需要遵循https://developers.google.com/accounts/docs/OAuth2WebServer的指导方针,就是这样。为此,你还需要在https://code.google.com/apis/console/注册以生成凭据并注册你的链接。我使用了指向我办公室IP的简单子域,因为它只允许域。
对于用户登录/管理和会话,我已经使用了这个插件的 flask http://packages.python.org/Flask-Login/-将有一些代码的基础上。
因此,首先要做的是索引视图:
所以这个视图只有在用户通过身份验证后才会打开。2谈论用户-用户模型:
UserMixin可能有问题,但我会处理后者。您的用户模型看起来会有所不同,只要使其与flak-login兼容即可。
那么剩下的就是自我认证了。我为
flask-login
设置了登录视图为'login'
。Login
视图呈现了带有指向google的登录按钮的html- google重定向到Auth
视图。它应该可以将用户重定向到google,以防它的网站只供登录用户使用。所以一切都被分成两部分--一部分用于在
_get_token
中获取google token,另一部分用于在_get_data
中使用它和检索基本用户数据。我的设置文件包含:
请记住,视图必须有URL路径附加到应用程序,所以我使用这个
urls.py
文件,这样我就可以更容易地跟踪我的视图,并导入更少的东西到 flask 应用程序创建文件:所有这些使得Google授权在Flask中工作。如果你复制粘贴它--它可能需要一些flask登录文档和SQLAlchemyMap的修补,但是想法是存在的。
vjrehmav3#
给予Authomatic(我是这个项目的维护者)。它使用起来非常简单,可以与任何Python框架一起工作,并且支持16个OAuth 2.0、10个OAuth 1.0a提供者和OpenID。
下面是一个简单的示例,说明如何通过Google对用户进行身份验证,并获取他/她的YouTube视频列表:
还有一个非常简单的Flask tutorial,它显示了如何通过Facebook和Twitter验证用户,并与它们的API对话以读取用户的新闻提要。
yc0p9oo04#
Flask-Dance是一个将Flask、Requests和OAuthlib链接在一起的新库。它有一个漂亮的API,并且内置了对Google auth的支持,along with a quickstart for how to get started。给予看吧!
7rfyedvj5#
我可以将接受的答案移植为使用Requests-OAuthlib而不是Rauth。截至本文撰写时,该包的最后一次提交是在2019年6月,目前有3万多个仓库使用。
要安装,请运行:
注意,
OAUTHLIB_RELAX_TOKEN_SCOPE
环境变量必须设置为True
以取消Scope has changed warning。在Windows上,可以通过运行以下命令来完成此操作:第一个
请求-OAuthlib文档可在此处找到https://requests-oauthlib.readthedocs.io/en/latest/index.html。
aydmsdu96#
Flask-oauth可能是您目前最好的选择,因为flask特定的方式来完成此操作,据我所知,它不支持令牌刷新,但它可以与Facebook一起使用,我们使用它来完成此操作,它是oauth 2。如果它不需要特定于flask,您可以考虑requests-oauth
alen0pnh7#
看来新模块Flask-Rauth是这个问题的答案:
Flask-Rauth是一个Flask扩展,允许您轻松地与OAuth 2.0、OAuth 1.0a和支持Ofly的应用程序进行交互。[...]这意味着Flask-Rauth将允许您的Flask网站上的用户登录到外部Web服务(即Twitter API、Facebook Graph API、GitHub等)。
请参阅:Flask-Rauth
23c0lvtd8#
由于oauth2 client现在已被弃用,我推荐bluemoon的建议。Flask中的OAuth2 Google身份验证的Bruno Rocha's model是使用lepture健壮的Flask-OAuthlib(pip-installable)的一个很好的起点。我建议模仿,然后扩展以满足您的需要。
zpqajqem9#
并不是专门针对google的--https://github.com/lepture/flask-oauthlib,它有一个示例说明如何在https://github.com/lepture/example-oauth2-server上实现客户机和服务器。