Я развернул собственную облачную функцию в GCP. В облачной функции я включил аутентификацию, используя сервисную учетную запись Google. Мне нужно написать Golang код для вызова этой облачной функции. Я сделал ту же самую цель с Nodejs, но не могу заставить Golang работать.
Вот мой код Nodejs (работает):
const {GoogleAuth} = require('google-auth-library');
const targetAudience = "cloud-function-url"
async function run() {
const auth = new GoogleAuth();
const client = await auth.getIdTokenClient(targetAudience);
const res = await client.request({ url });
console.info(res.data);
}
Мой Golang код:
import "golang.org/x/oauth2/google"
func getToken() (err error) {
scope := "https://www.googleapis.com/auth/cloud-platform"
client, err := google.DefaultClient(context.Background(), scope)
if err != nil {
return
}
res, err := client.Get("cloud-function-url")
if err != nil {
return
}
fmt.Println(res)
return
}
Я также пытался настроить код для добавления targetAudience
, но он также не работает
baseUrl := "your-cloudfunction-baseurl"
ctx := context.Background()
targetAudience := baseUrl
credentials, err := google.FindDefaultCredentials(ctx)
if err != nil {
fmt.Printf("cannot get credentials: %v", err)
os.Exit(1)
}
tokenSrc, err := google.JWTAccessTokenSourceFromJSON(credentials.JSON, targetAudience)
if err != nil {
fmt.Printf("cannot create jwt source: %v", err)
os.Exit(1)
}
client := oauth2.NewClient(context.Background(), tokenSrc)
if err != nil {
return
}
res, err := client.Get(baseUrl + "sub-url")
if err != nil {
return
}
Я проверил и убедился что мой сервисный аккаунт был загружен правильно. В обоих случаях выше, я получил 401 "The access token could not be verified"