【问题标题】:GAE Python OAuth 2.0 NotAllowedErrorGAE Python OAuth 2.0 NotAllowedError
【发布时间】:2016-02-16 08:29:32
【问题描述】:

我一直在努力使以下 python 代码示例正常工作,但没有成功 https://cloud.google.com/appengine/docs/python/oauth/

gae-test.py

from google.appengine.api import oauth
import logging
import traceback
import webapp2

class Test(webapp2.RequestHandler):
  def get(self):
    scope = 'https://www.googleapis.com/auth/userinfo.email'
    self.response.write('\noauth.get_current_user(%s)' % repr(scope))
    try:
      user = oauth.get_current_user(scope)
      self.response.write(' = %s\n' % user)
      self.response.write('- auth_domain = %s\n' % user.auth_domain())
      self.response.write('- email       = %s\n' % user.email())
      self.response.write('- nickname    = %s\n' % user.nickname())
      self.response.write('- user_id     = %s\n' % user.user_id())
    except oauth.OAuthRequestError, e:
      self.response.set_status(401)
      self.response.write(' -> %s %s\n' % (e.__class__.__name__, e.message))
      logging.warn(traceback.format_exc())

app = webapp2.WSGIApplication([
    ('/', Test),
], debug=True)

和 app.yaml

application: mytestapp
version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: .*
  script: gae-test.app

每次错误都是NotAllowedError。它永远不会让用户同意屏幕。

我在 GAE 项目中创建了客户端 ID(尽管我认为仅检索用户电子邮件没有必要),并且还填写了用户同意书。我认为必须启用所有必要的 API,因为 users.get_current_user() 工作正常。

我的要求是从 users.get_current_user() 中删除丑陋的用户同意屏幕,因此一直在尝试这种方法。

【问题讨论】:

  • 您是在 dev_appserver 上本地运行它,还是部署到 yourappname.appspot.com 上的生产应用程序?
  • 我在 appspot.com 上直播。刚刚更新了我的完整代码。

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


【解决方案1】:

oauth.get_current_user(带或不带范围参数)检查对您应用的请求是否包括为您的应用生成的授权标头 (A) 和 (B) 包括请求的范围(如果有)。

要准备令牌,向您的应用发送请求的程序 必须遵循https://developers.google.com/identity/protocols/OAuth2 中概述的步骤。我强调 program 因为直接来自浏览器的请求将没有适当的授权标头 - 除非浏览器正在运行知道如何通过的 Javascript 程序(可能也是您的应用程序以前提供的)有问题的篮球。

我不知道这会如何让您“摆脱丑陋的用户同意屏幕”——这不是由 users.get_current_user 本身显示的,而是来自 Google 身份验证和授权服务器(不可避免地,任何最终需要生成 OAuth2 令牌的程序。

除了在同意屏幕上,用户是否会同意为您的应用提供您请求的任何范围,例如,了解用户的电子邮件?

【讨论】:

  • 谢谢亚历克斯。如何从我的应用程序发送授权标头?
  • @Nick, users.get_current_user 是获得授权的标准 GAE 方式——如果这对您不利,请参阅我已经提供的 OAuth2 URL(您必须开发并提供给浏览器一些 Javascript 来遵循这些步骤 - 抱歉,但 Javascript 不是我的超能力:-)。
  • 哦,谢谢 :) 我会坚持 users.get_current_user 并让我的网站 FB 计数让访问者相信丑陋的 google sso 屏幕不是黑客网站 :)
  • @Nick,听起来不错(所以也许您可以通过单击其左侧的复选标记形状的轮廓来接受此答案)-另外,如果您对 Google 同意屏幕的外观有具体建议当通过users.get_current_user 调用时可能会得到改进,请将它们作为详细的功能请求发布到code.google.com/p/googleappengine/issues/list - 我们会监控该问题跟踪器,并确保功能请求到达适当的决策者(在这里,我猜, UI 专家)供他们接受或拒绝——在此先感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 2012-08-09
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
相关资源
最近更新 更多