+
95
-

如何通过http获取$(gcloud auth print-access-token)这个gcloudaccess-token值?

如何通过http获取$(gcloud auth print-access-token)这个gcloudaccess-token值?

不安装gcloud如何才能获取这个access-token?

https://cloud.google.com/sdk/docs/install?hl=zh-cn


网友回复

+
15
-

gcloud access-token这个值谷歌cloud官方是通过gcloud 的客户端命令行获取的,需要下载到本地运行后获取

当然也有人根据这套协议写出了不需要命令行的代码,模拟了命令行的执行:

我们以cloudflare的worker为例,其他的编程语言可以通过ai更换:

// 配置变量

const PROJECT_ID = '';
const CLIENT_EMAIL = '';
const PRIVATE_KEY ="";

addEventListener("fetch", (event) => {
  event.respondWith(handleRequest(event.request));
});
async function handleRequest(request) {
const [token, err] = await exchangeJwtForAccessToken(signedJWT)
if (token === null) {
      console.log(`Invalid jwt token: ${err}`)
      return createErrorResponse(500, "api_error", "invalid authentication credentials");
}
}

function createErrorResponse(status, errorType, message) {
  const errorObject = { type: "error", error: { type: errorType, message: message } };
  return new Response(JSON.stringify(errorObject), {
      status: status,
      headers: {
          "Content-Type": "application/json",
          "Access-Control-Allow-Origin": "*",
      },
  });
}

async function createSignedJWT(email, pkey) {
  pkey = pkey.replace(/-----BEGIN PRIVATE KEY-----|-----END PRIVATE KEY-----|\r|\n|\\n/g, "");
  let cryptoKey = await crypto.subtle.importKey(
      "pkcs8",
      str2ab(atob(pkey)),
      {
          name: "RSASSA-PKCS1-v1_5",
          hash: { name: "SHA-256" },
      },
      false,
      ["sign"]
  );

  const authUrl = "https://www.googleapis.com/oauth2/v4/token";
  const issued = Math.floor(Date.now() / 1000);
  const expires = issued + 600;

  const header = {
      alg: "RS256",
      typ: "JWT",
  };

  const payload = {
      iss: email,
      aud: authUrl,
      iat: issued,
      exp: expires,
      scope: "https://www.googleapis.com/auth/cloud-platform",
  };

  const encodedHeader = urlSafeBase64Encode(JSON.stringify(header));
  const encodedPayload = urlSafeBase64Encode(JSON.stringify(payload));

  const unsignedToken = `${encodedHeader}.${encodedPayload}`;

  const signature = await crypto.subtle.sign(
      "RSASSA-PKCS1-v1_5",
      cryptoKey,
      str2ab(unsignedToken)
  );

  const encodedSignature = urlSafeBase64Encode(signature);
  ret...

点击查看剩余70%

我知道答案,我要回答