【问题标题】:How does oauth2client work with AppEngine users library (GAE Python)oauth2client 如何与 AppEngine 用户库 (GAE Python) 一起使用
【发布时间】:2018-08-22 08:12:12
【问题描述】:

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

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

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

但是,我从未见过这些是由 oauth2client 设置的,所以我仍然感到困惑。

【问题讨论】:

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


    【解决方案1】:

    查看 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。

    【讨论】:

    • 感谢您指出这一点。不过,我想知道用户库如何“知道”如何/何时使用 oauth 与常规 GAE 身份验证。据我所知(来自users doc),oauth2client 必须设置一些环境变量,如 AUTH_DOMAIN、USER_ID 等,但我没有看到 oauth2client 库实际上这样做。
    • 其实恰恰相反。 oauth2client 确定代码运行的环境,如果在 App Engine 上运行,则委托给用户 API 进行身份验证。
    【解决方案2】:

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

    from google.appengine.api import users
    
        ...
    
        print users.get_current_user()  # Prints user's email
    

    要使用oauth2client,您需要在代码中实际配置和使用它,它的操作与users 操作完全分离(如果仍在使用,它也将继续工作,因为你观察到了)。

    【讨论】:

    • 也许我不清楚提供的示例中到底发生了什么,但系统会提示用户使用 oauth 登录屏幕登录,但从未显示 App Engine 用户库登录屏幕(来自 users.CreateLoginURL())
    • 检查在代码切换到oauth2之前用户是否有任何机会没有保持登录状态(来自users预期) - 浏览器cookie可以做到这一点。也尝试与其他用户一起使用。甚至可以保留 users 身份验证(用于测试目的),以便您可以根据需要登录/注销,直到您确信新代码按预期工作。
    • 我认为这可能不是问题所在。我正在使用隐身浏览会话,但使用上述代码时users.get_current_user().user_id() 返回的值与使用不带 oauth 的用户库时返回的值不同。
    猜你喜欢
    • 2013-11-06
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 2016-12-20
    相关资源
    最近更新 更多