Google cloud platform GCP发布/订阅身份验证令牌未出现在请求中

Google cloud platform GCP发布/订阅身份验证令牌未出现在请求中,google-cloud-platform,google-cloud-pubsub,Google Cloud Platform,Google Cloud Pubsub,我正在设置云发布/订阅服务,以便通过以下操作在后端接收推送订阅消息 由于某些原因,发送到后端的推送订阅请求从未包含“token”查询参数,因此后端无法验证推送请求是否来自应用程序。开发者文档中的以下代码用于实现验证目的: // Verify that the request originates from the application. if (req.getParameter("token").compareTo(pubsubVerificationToken) != 0) {

我正在设置云发布/订阅服务,以便通过以下操作在后端接收推送订阅消息

由于某些原因,发送到后端的推送订阅请求从未包含“token”查询参数,因此后端无法验证推送请求是否来自应用程序。开发者文档中的以下代码用于实现验证目的:

  // Verify that the request originates from the application.
  if (req.getParameter("token").compareTo(pubsubVerificationToken) != 0) 
  {
      resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
      return;
  }

根据文档,我已经验证了“服务帐户令牌创建者”权限已授予发布/订阅的签名服务,并且启用了“推送端点身份验证”选项,并为发布/订阅中的推送订阅中的“受众(可选)”字段分配了唯一字符串


我想知道我是否还遗漏了什么,或者我弄错了象征性观众的工作方式?为什么“令牌”值没有出现在我的后端收到的请求中?任何意见都将不胜感激

正如约翰·汉利(John Hanley)所说,标记在标题中。然而,当我查看您的代码时,我不知道您想要“比较”什么。提供的令牌经常更改(因为它的生命周期很短),您无法将其与引用令牌进行比较

但是,您可以从令牌中提取索赔信息,然后对其进行验证。这里是我用来提取电子邮件的Python代码片段

    authorization = request.headers['Authorization'][7:]
    b64_profile = authorization.split('.')[1]
    profile = base64.b64decode(b64_profile + '=' * (-len(b64_profile) % 4))
    print(json.loads(profile)['email'])
此处引用的标记用于验证应用程序令牌。此令牌由应用程序开发人员在
appengine web.xml
()中定义为环境变量

正确验证推送请求来源的令牌是另一个令牌。它由云发布/订阅生成,以JWT的形式出现在推送请求的授权头中。这段代码展示了如何验证JWT(您也可以查看):

//验证并解码JWT。
GoogleIdToken=验证器。验证(授权);

希望这有助于消除困惑。:-)

谷歌不使用查询参数进行授权。身份验证使用的是HTTP
Authorization:bearer-TOKEN
头。@JohnHanley感谢您的评论。经过几个小时的挣扎,我也意识到了这一点。他们在文档的Java代码中添加了这个额外的验证步骤,查询参数也被称为“token”,这让我对参数和实际的身份验证令牌非常困惑……现在都清除了。我猜他们在文档中使用Java的方式是向推送端点附加一个包含一些值的令牌查询参数,因此当请求到达后端时,可以快速验证它。