我有一个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设置的,所以我仍然感到困惑。
答案 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。