我有一个GAE应用程序,我正在从使用app用户库过渡到使用oauth2使用oauth2client。
我读到了一些关于在App中使用oauth2的问题(例如,oauth2),而且用户库似乎不理解是否有其他身份验证系统(即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登录屏幕)登录,但是对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,所以我仍然感到困惑。
发布于 2018-03-20 16:40:45
通过查看oauth2client客户端库的@oauth2deco.oauth_required装饰器的源代码,在内部,库似乎正在使用Users来执行身份验证:
if not user:
request_handler.redirect(users.create_login_url(
request_handler.request.uri))
return
这个装饰器是在oauth2client.contrib.appengine包中定义的,这是一个使Google上的OAuth 2.0更容易使用的实用工具。
发布于 2018-03-13 22:50:33
那么,您仍然在使用users:
from google.appengine.api import users
...
print users.get_current_user() # Prints user's email
要使用oauth2client
,您需要在代码中实际配置和使用它,它的操作与users
操作完全分离(如您所观察到的,如果仍在使用的话,users
操作也将继续执行其工作)。
https://stackoverflow.com/questions/49266887
复制相似问题