gpt4 book ai didi

google-cloud-platform - 通过 nodejs 使用不记名 token 进行谷歌云身份验证

转载 作者:行者123 更新时间:2023-12-04 00:01:53 26 4
gpt4 key购买 nike

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

我收到了一个用于身份验证的服务帐户以及对 gcloud 命令行工具的访问权限。

像这样使用 gcloud 命令行时:

gcloud auth print-identity-token

我可以生成一个 token ,该 token 可用于向 api 发出发布请求。这有效,我可以从 postman 、失眠症和我的 nodejs 应用程序成功地向 api 发出请求。

但是,当我将 JWT 身份验证与“googleapis”或“google-auth”npm 库一起使用时,如下所示:
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 :
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'
}

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

请帮忙,我不确定为什么第一个不记名 token 有效,但使用 JWT 生成的 token 无效。

编辑

我还尝试获取身份 token 而不是像这样的访问 token :
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))

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

编辑以显示我如何调用端点

只是附带说明,下面的任何这些方法都可以与命令行身份 token 一起使用,但是当通过 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
})
}

方法 2(使用我用 google-auth 创建的“授权”客户端):
  const res = await client.request({
url: url,
method: 'post',
data: `{
My graphQL query goes here ...
}`
})
console.log(res.data)
}

最佳答案

以下是 node.js 中的一个示例,该示例正确创建了具有正确受众的身份 token ,用于调用 Cloud Run 或 Cloud Functions 服务。
修改此示例以适合 GraphQLClient。不要忘记在每次调用中包含 Authorization header 。

    // 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)
}
}
);
}
})

关于google-cloud-platform - 通过 nodejs 使用不记名 token 进行谷歌云身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60265116/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com