有谁能给我举一个完整的例子,用OAuth2和Flask验证Google账户,而不是App Engine上的呢?
我试图让用户访问Google Calendar,然后使用该访问从日历中检索信息并进一步处理它。我还需要存储OAuth2令牌并在稍后刷新。
我已经看过Google的oauth2client库,并且可以开始检索授权代码,但是我有点迷路了。看看Google的OAuth 2.0 Playground,我知道我需要请求刷新令牌和访问令牌,但是库中提供的示例仅用于App Engine和Django。
我也尝试过使用Flask's OAuth module,其中包含对OAuth2的引用,但我也看不到任何方法可以在那里交换授权代码。
我可能会手工编写请求,但更希望使用或改编现有的python模块,使请求更容易、正确地处理可能的响应,甚至可能有助于存储令牌。
有这种事吗?
我已经搜索了很多关于使用不同库的信息,但从某种意义上讲,它们似乎都太过杀伤力(你可以在任何平台上使用它,但是你需要大量的代码)或者文档并没有解释我想要什么。长话短说-我从零开始写它,从而了解认证过程真正的谷歌API。并不像听起来那么难。基本上你需要遵循https://developers.google.com/accounts/docs/OAuth2WebServer准则,就这样。 为此,您还需要在https://code.google.com/apis/console/注册以生成凭据并注册链接。我使用了指向我的office IP的简单子域,因为它只允许域。
对于用户登录/管理和会话,我已经在flaskhttp://packages.python.org/Flask-Login/中使用了这个插件-将有一些基于它的代码。
所以第一件事-索引视图:
所以这个视图在我们拥有经过身份验证的用户之前不会打开。 谈论用户-用户模型:
UserMixin可能有问题,但我将处理后者。您的用户模型看起来会有所不同,只需使其与flask登录兼容即可。
所以剩下的就是自我认证。我为
flask-login
设置的登录视图是'login'
。Login
视图呈现带有登录按钮的html,该按钮指向google-google重定向到Auth
视图。它应该可以只是重定向用户到谷歌的情况下,它的网站只有登录用户。所以所有的东西都被分成两部分-第一部分是在
_get_token
中获取google令牌。其他用于在_get_data
中使用它和检索基本用户数据。我的设置文件包含:
请记住,视图必须有附加到应用程序的url路径,所以我使用了这个
urls.py
文件,这样我可以更轻松地跟踪我的视图,并将更少的内容导入flask应用程序创建文件:所有这些加在一起使得谷歌授权工作在烧瓶。如果你复制粘贴它-它可能需要一些与flask登录文档和SQLAlchemy映射的修补,但想法是存在的。
试试Authomatic(我是那个项目的维护者)。它使用非常简单,可以与任何Python框架一起工作,并且支持16oauth 2.0,10oauth 1.0a提供程序和OpenID。
下面是一个简单的示例,介绍如何使用Google对用户进行身份验证,并获取他/她的YouTube视频列表:
还有一个非常简单的Flask tutorial,它展示了如何通过Facebook和Twitter对用户进行身份验证,并与他们的api对话以读取用户的新闻提要。
另一个答案提到Flask-Rauth,但没有详细说明如何使用它。有一些Google特有的问题,但我最终实现了它,它工作得很好。我把它与Flask登录集成起来,这样我就可以用像
@login_required
这样有用的糖来装饰我的视图。我希望能够支持多个OAuth2提供者,因此部分代码是通用的,并且基于Miguel Grinberg关于用脸谱网和Twitter支持OAuth2的优秀文章here。
首先,将来自Google的特定Google身份验证信息添加到应用程序的配置中:
当您创建应用程序时(在我的例子中,模块的
__init__.py
):在应用程序模块中,创建
auth.py
:这将创建一个可以子类化的泛型
OAuthSignIn
类。Google子类从Google发布的信息列表中提取信息(JSON格式here)。这是随时可能更改的信息,因此这种方法将确保它始终是最新的。其中一个限制是,如果在初始化Flask应用程序(导入的模块)时服务器上没有可用的Internet连接,则无法正确实例化该应用程序。这几乎不应该是一个问题,但是在配置数据库中存储最后一个已知的值来覆盖这种可能性是一个好主意。最后,类在
callback()
函数中返回name, email
的元组。实际上,Google会返回更多信息,包括Google+个人资料(如果有的话)。检查oauth_session.get('').json()
返回的字典以查看全部内容。 如果在authorize()
函数中扩展作用域(对于我的应用程序,email
就足够了),则可以通过Google API访问更多信息。接下来,编写视图将其绑定在一起:
最后,我的
/login
视图和模板来实现这一切:登录.html:
确保正确的回呼地址在Google注册,用户只需点击登录页面上的“登录Google”,它就会注册并登录。
相关问题 更多 >
编程相关推荐