当前位置: 首页 > 知识库问答 >
问题:

通过nodejs实现承载令牌的google云认证

苏胤
2023-03-14

我的客户机有一个GraphQL API运行在Google cloud Run上。

我已经使用了一个服务帐户进行身份验证,并访问了gcloud命令行工具。

当使用gcloud命令行时,如下所示:

gcloud auth print-identity-token

我可以生成一个令牌,用于向API发出post请求。这工作,我可以成功地从邮递员,失眠和从我的nodejs应用程序的api发布请求。

var { google } = require('googleapis')

let privatekey = require('./auth/google/service-account.json')

let jwtClient = new google.auth.JWT(
  privatekey.client_email,
  null,
  privatekey.private_key,
  ['https://www.googleapis.com/auth/cloud-platform']
)

jwtClient.authorize(function(err, _token) {
  if (err) {
    console.log(err)
    return err
  } else {
    console.log('token obj:', _token)
  }
})

这将输出一个“承载”令牌:

token obj: {
  access_token: 'ya29.c.Ko8BvQcMD5zU-0raojM_u2FZooWMyhB9Ni0Yv2_dsGdjuIDeL1tftPg0O17uFrdtkCuJrupBBBK2IGfUW0HGtgkYk-DZiS1aKyeY9wpXTwvbinGe9sud0k1POA2vEKiGONRqFBSh9-xms3JhZVdCmpBi5EO5aGjkkJeFI_EBry0E12m2DTm0T_7izJTuGQ9hmyw',
  token_type: 'Bearer',
  expiry_date: 1581954138000,
  id_token: undefined,
  refresh_token: 'jwt-placeholder'
}

但是,这个承载令牌并不像上面的那样工作,并且在发出与gcloud命令“gcloud auth print-identity-token”相同的请求时,总是给出一个“未经授权的错误401”。

请帮助,我不知道为什么第一个承载令牌工作,而用JWT生成的不工作。

我还尝试获取身份令牌而不是访问令牌,如下所示:

let privatekey = require('./auth/google/service-account.json')

let jwtClient = new google.auth.JWT(
  privatekey.client_email,
  null,
  privatekey.private_key,
  []
)

jwtClient
  .fetchIdToken('https://my.audience.url')
  .then((res) => console.log('res:', res))
  .catch((err) => console.log('err', err))

这会打印一个身份令牌,但是,使用它也只会给出一个“401未授权”的消息

附带说明,下面的任何方法都可以使用命令行标识令牌,但是当通过JWT生成时,它返回一个401

 const client = new GraphQLClient(baseUrl, {
        headers: {
          Authorization: 'Bearer ' + _token.id_token
        }
      })
      const query = `{
        ... my graphql query goes here ...
    }`
      client
        .request(query)
        .then((data) => {
          console.log('result from query:', data)
          res.send({ data })
          return 0
        })
        .catch((err) => {
          res.send({ message: 'error ' + err })
          return 0
        })
    }
  const res = await client.request({
    url: url,
    method: 'post',
    data: `{
        My graphQL query goes here ...
    }`
  })
  console.log(res.data)
}

共有1个答案

欧阳勇
2023-03-14

这里是Node.js中的一个示例,它正确地创建了一个具有正确受众的标识令牌,用于调用云运行或云函数服务。

修改此示例以适应GraphQLClient。不要忘记在每个调用中包含授权标头。

    // This program creates an OIDC Identity Token from a service account
    // and calls an HTTP endpoint with the Identity Token as the authorization
    
    var { google } = require('googleapis')
    const request = require('request')
    
    // The service account JSON key file to use to create the Identity Token
    let privatekey = require('/config/service-account.json')
    
    // The HTTP endpoint to call with an Identity Token for authorization
    // Note: This url is using a custom domain. Do not use the same domain for the audience
    let url = 'https://example.jhanley.dev'
    
    // The audience that this ID token is intended for (example Google Cloud Run service URL)
    // Do not use a custom domain name, use the Assigned by Cloud Run url
    let audience = 'https://example-ylabperdfq-uc.a.run.app'
    
    let jwtClient = new google.auth.JWT(
        privatekey.client_email,
        null,
        privatekey.private_key,
        audience
    )
    
    jwtClient.authorize(function(err, _token) {
        if (err) {
            console.log(err)
            return err
        } else {
            // console.log('token obj:', _token)
    
            request(
                {
                    url: url,
                    headers: {
                        "Authorization": "Bearer " + _token.id_token
                    }
                },
                function(err, response, body) {
                    if (err) {
                        console.log(err)
                        return err
                    } else {
                        // console.log('Response:', response)
                        console.log(body)
                    }
                }
            );
        }
    })
 类似资料:
  • 我有几个azure函数,我想设置一个基于令牌的身份验证(使用承载令牌)。我想确保没有在HTTP头中传递承载令牌的用户不能访问azure函数。我正在使用可视代码/蔚蓝云。如有任何帮助或指导,将不胜感激。我有一种方法可以使用客户端id、secret和租户id来获得承载令牌,但是如何使其成为azure函数的必填字段呢?

  • 是否可以使用来自Google API客户端Javascript库的承载令牌来授权Google云存储桶,而无需向用户请求https://www.googleapis.com/auth/devstorage范围。该桶具有对所有Google帐户的读写访问权限。

  • 当一个人试图使用azure AD承载令牌访问我们的系统时,这个获取和缓存资源令牌的工作流程是不存在的。 所以我的问题是,我如何使用承载令牌来启用它?如何才能像使用OpenIDConnect一样请求额外的资源令牌?是否可以使用ADAL从承载令牌获取授权代码?

  • 我已经编写了一个云函数,该函数接收一个Base64字符串并将其传递到Google Cloud Vision API中,我还在客户端上编写了一个函数,该函数通过HTTP调用Firebase云函数。 虽然数据可以很好地从客户端传递到云功能,但服务器对Google Vision API的请求不起作用。我得到一个状态码错误。 我很确定这与授权承载令牌有关,因为在shell中使用环境变量运行它就可以了。顺便

  • 问题内容: 我正在.NET Web应用程序中实现Web API 2服务体系结构。使用请求的客户端是纯JavaScript,没有mvc / asp.net。我正在使用OWIN根据本文尝试启用令牌身份验证,并使用Web API Sample进行OWIN承载令牌身份验证 。授权后,我似乎在身份验证步骤中缺少某些内容。 我的登录名如下: 它返回 然后,我尝试在AngularJS中的其他请求上设置HTTP标

  • 问题内容: 我正在编写一个想同时用作Web应用程序和API提供程序的nodejs应用程序。验证用户身份后,我想为该用户分配一个令牌,以用于后续请求。这对于Web应用程序的通行证非常有用,因为我只是在会话中使用令牌对用户进行序列化和反序列化。但是,在响应API请求时,没有用于设置存储会话信息的cookie。理想情况下,护照将在会话和请求正文中都寻找令牌。有什么方法可以配置通行证来完成此任务吗? 问题