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

How does oauth2client work with AppEngine users library (GAE Python)

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

我阅读了一些关于在 App Engine 中使用 oauth2 的问题(例如,),用户库似乎不了解是否使用了任何其他身份验证系统(即 oauth2)来进行身份验证用户。

所以我打算使用 oauth2 而不是用户库来手动滚动我的 logged-in/out 模型。然而,我随后惊讶地发现,在使用 oauth2client.appengine 库时,对 users 库的调用返回了来自 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() 函数 returns 一个新的 User() 对象,它似乎读取了一些环境变量:https://cloud.google.com/appengine/docs/standard/python/refdocs/modules/google/appengine/api/users#User

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

嗯,你还在使用用户 api:

from google.appengine.api import users

    ...

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

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

查看 oauth2client 客户端库的 source code 的 @oauth2deco.oauth_required 装饰器,似乎该库在内部使用用户 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。