【问题标题】:How do I pass user credentials to a App Engine Task Queue servlet?如何将用户凭据传递给 App Engine 任务队列 servlet?
【发布时间】:2015-04-15 01:13:53
【问题描述】:

假设您有一个通过 Google 帐户进行身份验证的用户通过 /run 进入您的应用程序,然后您需要在该用户的默认任务队列中分拆一些东西。现在,该用户的凭据不会传递到任务 servlet(例如 /worker)。有没有办法通过它们?也许通过从原始请求中获取标头并将它们添加到任务队列请求中?

【问题讨论】:

  • 您是否尝试离线访问用户数据?
  • 目前两个答案都不正确或增加了不必要的开销。查看链接的副本
  • 我正在尝试通过登录用户发送电子邮件。 App Engine 仅允许从与应用关联的管理员或当前登录的用户发送电子邮件(我意识到的简化解释)。如果代码在 /run 中,我可以以登录用户的身份发送电子邮件,但如果我把它放在 /worker 中,则不会传递凭据,我会收到未经授权的发件人异常。
  • 我查看了“在应用程序引擎任务队列中传递多个参数”的可能副本,但这与我的问题无关——除非有办法在网址(请尽可能说明)。

标签: google-app-engine


【解决方案1】:

如果您使用的是 Java Servlet,则可以使用以下逻辑:

  • 成功登录后(使用 Google+ 登录和 Endpoint),将用户凭据作为属性存储在 HttpSession 中(将 HttpServletRequest 作为参数放入 Endpoint API,然后获取会话)。
  • 在您的 servlet 逻辑中,获取会话并检索凭据。

附:不要忘记在您的 appengine-web.xml 中设置 <sessions-enabled>true</sessions-enabled>

【讨论】:

    【解决方案2】:

    将用户凭据从您的应用程序放入数据存储区,然后在您的任务中从数据存储区读取它们。

    使用 ndb 和 oauth2client 的 Python 用户模型示例:

    from google.appengine.ext import ndb
    from oauth2client import appengine
    
    class User(ndb.Model):
        # among other user props
        credentials = appengine.CredentialsNDBProperty()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      相关资源
      最近更新 更多