为 google 云函数生成不记名令牌 - Java
Generate bearer token for google cloud function - Java
我正在尝试从 java 连接到云功能,例如 https://us-west1-<>.cloudfunctions.net,并且我正在尝试为生成不记名令牌此函数使用代码如下:
String audience = https://<projectname>-<region>-<projectid>.cloudfunctions.net/<myFunction>;
GoogleCredentials credentials = GoogleCredentials
.getApplicationDefault()
.createScoped(Arrays.asList("https://www.googleapis.com/auth/cloud-platform"));
IdTokenCredentials tokenCredential =
IdTokenCredentials.newBuilder()
.setIdTokenProvider((IdTokenProvider) credentials)
.setTargetAudience(audience)
.build();
tokenCredential.refresh();
String token = tokenCredential.getIdToken().getTokenValue();
当我运行应用程序生成令牌。但是如果我拿到令牌并将其放在邮递员身上,服务器 returns 一个 401 错误:401 Unauthorized.
如果我在 GCP 云 shell 终端中使用 GCP 命令“gcloud auth print-identity-token”,并在 postman 中使用此令牌,则云函数调用成功。
用于获取凭据的Json文件与此类似:
{
"type": "service_account",
"project_id": "<project_id>",
"private_key_id": "<private_key_id>",
"private_key": "-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n",
"client_email": "aaa@<project_id>.iam.gserviceaccount.com",
"client_id": "<client_id>",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/<principle>"
}
请帮助我弄清楚如何在 java 中生成不记名令牌以调用 google 云函数。
谢谢
当我使用如下正确的观众值时,这个问题得到了解决。
https://function-url/projects/project-id/locations/区域/函数/function-name
在上面的 URI 中,将 function-url、project-id、区域和 function-name 替换为您的值。
以下是工作代码。复制并粘贴它。这就是你想要的堆栈溢出,对吧? ;-)
public String getAccessToken(String audience) throws IOException {
InputStream resource = new ClassPathResource(
"gcp/service-account.json").getInputStream();
GoogleCredentials credentials = GoogleCredentials
.fromStream(resource)
.createScoped(Arrays.asList("https://www.googleapis.com/auth/cloud-platform"));
credentials.refreshAccessToken();
IdTokenCredentials tokenCredential =
IdTokenCredentials.newBuilder()
.setIdTokenProvider((IdTokenProvider) credentials)
.setTargetAudience(audience)
.build();
tokenCredential.refresh();
return tokenCredential.getIdToken().getTokenValue();
}
在上面的代码中,
- “gcp/service-account.json”是我的服务帐户 json 文件的路径。它位于我的 spring-boot 项目中的 src/main/resources 文件夹(即类路径)下。
- 可能不需要
credentials.refreshAccessToken();
和 tokenCredential.refresh();
。我没有尝试删除这些。有时间会试试。
希望对大家有帮助!!由于我找不到太多关于“受众”值的帮助,所以我花了一些时间通过反复试验找出正确的值。
我正在尝试从 java 连接到云功能,例如 https://us-west1-<>.cloudfunctions.net,并且我正在尝试为生成不记名令牌此函数使用代码如下:
String audience = https://<projectname>-<region>-<projectid>.cloudfunctions.net/<myFunction>;
GoogleCredentials credentials = GoogleCredentials
.getApplicationDefault()
.createScoped(Arrays.asList("https://www.googleapis.com/auth/cloud-platform"));
IdTokenCredentials tokenCredential =
IdTokenCredentials.newBuilder()
.setIdTokenProvider((IdTokenProvider) credentials)
.setTargetAudience(audience)
.build();
tokenCredential.refresh();
String token = tokenCredential.getIdToken().getTokenValue();
当我运行应用程序生成令牌。但是如果我拿到令牌并将其放在邮递员身上,服务器 returns 一个 401 错误:401 Unauthorized.
如果我在 GCP 云 shell 终端中使用 GCP 命令“gcloud auth print-identity-token”,并在 postman 中使用此令牌,则云函数调用成功。
用于获取凭据的Json文件与此类似:
{
"type": "service_account",
"project_id": "<project_id>",
"private_key_id": "<private_key_id>",
"private_key": "-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n",
"client_email": "aaa@<project_id>.iam.gserviceaccount.com",
"client_id": "<client_id>",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/<principle>"
}
请帮助我弄清楚如何在 java 中生成不记名令牌以调用 google 云函数。
谢谢
当我使用如下正确的观众值时,这个问题得到了解决。
https://function-url/projects/project-id/locations/区域/函数/function-name
在上面的 URI 中,将 function-url、project-id、区域和 function-name 替换为您的值。
以下是工作代码。复制并粘贴它。这就是你想要的堆栈溢出,对吧? ;-)
public String getAccessToken(String audience) throws IOException {
InputStream resource = new ClassPathResource(
"gcp/service-account.json").getInputStream();
GoogleCredentials credentials = GoogleCredentials
.fromStream(resource)
.createScoped(Arrays.asList("https://www.googleapis.com/auth/cloud-platform"));
credentials.refreshAccessToken();
IdTokenCredentials tokenCredential =
IdTokenCredentials.newBuilder()
.setIdTokenProvider((IdTokenProvider) credentials)
.setTargetAudience(audience)
.build();
tokenCredential.refresh();
return tokenCredential.getIdToken().getTokenValue();
}
在上面的代码中,
- “gcp/service-account.json”是我的服务帐户 json 文件的路径。它位于我的 spring-boot 项目中的 src/main/resources 文件夹(即类路径)下。
- 可能不需要
credentials.refreshAccessToken();
和tokenCredential.refresh();
。我没有尝试删除这些。有时间会试试。
希望对大家有帮助!!由于我找不到太多关于“受众”值的帮助,所以我花了一些时间通过反复试验找出正确的值。