oauth2client如何与AppEngine用户库(GAE Python)一起使用

时间:2018-03-13 22:31:05

标签: google-app-engine google-oauth google-app-engine-python

我有一个GAE Python应用程序,我正在使用oauth2client从App Engine用户库转换到oauth2。

我读了一些关于在App Engine中使用oauth2的问题(例如,Managing users authentication in Google App Engine),并且似乎用户库不理解是否使用任何其他身份验证系统(即oauth2)来验证用户。

所以我计划使用oauth2而不是用户库来手动滚动我的登录/退出模型。但是,当我使用oauth2client.appengine库时,我很惊讶地发现,对用户库的调用从oauth2认证用户返回了数据,如下面的示例代码所示:

import webapp2
from google.appengine.api import users
from oauth2client.appengine import OAuth2Decorator

oauth2deco = OAuth2Decorator(...)

class TestOauth(webapp2.RequestHandler):
  @oauth2deco.oauth_required
  def get(self):
    print users.get_current_user()  # Prints user's email

app = webapp2.WSGIApplication([
    ('/', TestOauth),
    (oauth2deco.callback_path, oauth2deco.callback_handler())
])

在上面的示例中,系统会提示用户使用oauth2登录屏幕登录(并且来自users.CreateLoginURL的传统App Engine登录屏幕),但是对users.get_current_user的调用( )按预期工作。

我很好奇,这是怎么回事?我看到users.get_current_user()函数返回一个新的User()对象,它似乎读取了一些环境变量:https://cloud.google.com/appengine/docs/standard/python/refdocs/modules/google/appengine/api/users#User

但是,我从来没有看到这些是由oauth2client设置的,所以我仍然感到困惑。

2 个答案:

答案 0 :(得分:1)

好吧,你还在使用用户api:

from google.appengine.api import users

    ...

    print users.get_current_user()  # Prints user's email

要使用oauth2client您需要在代码中实际配置和使用它,它的操作与users操作完全分开(如果仍然可以继续执行它的工作在使用中,正如您所观察到的那样。)

答案 1 :(得分:1)

查看@ oauth2deco.oauth_required装饰器的oauth2client客户端库source code,看来内部库正在使用Users API执行身份验证:

if not user:
    request_handler.redirect(users.create_login_url(
        request_handler.request.uri))
    return

此装饰器在oauth2client.contrib.appengine包中定义,该实用程序用于在Google App Engine上更轻松地使用OAuth 2.0。