На моем клиенте запущен API-интерфейс GraphQL, работающий в облачном хранилище Google.
Я получил служебную учетную запись для аутентификации, а также доступ к инструменту командной строки gcloud.
При использовании команды gcloud строка так:
gcloud auth print-identity-token
Я могу сгенерировать токен, который можно использовать для отправки запросов к API. Это работает, и я могу делать успешные почтовые запросы к API от почтальона, бессонницы и от моего приложения nodejs.
Однако, когда я использую аутентификацию 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 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'
}
, однако этот токен на переносчике не работает, как указано выше, и всегда выдает "неавторизованную ошибку 401" при выполнении тех же запросов, что и с командой gcloud "gcloud auth print-identity-token".
Пожалуйста, помогите, я не уверен, почему работает первый токен-носитель, а тот, сгенерированный с помощью 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 неавторизован».
Отредактируйте, чтобы показать, как я вызываю конечную точку
Примечание: любой из этих методов ниже работает с токеном идентификации командной строки, однако при генерации d через JWT возвращает 401
метод 1:
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)
}