【发布时间】:2022-01-03 22:19:23
【问题描述】:
我已经在 C# 中构建了一个 Azure 函数应用程序,我正在尝试找出 Java 中的 Google.Apis.Auth.OAuth2.GoogleCredential.UnderlyingCredential.GetAccessTokenForRequestAsync() 的等效项,因为我的客户需要我的代码框架一个Java。我需要能够返回 Json Web Token (JWT) 并将其调用到函数内的返回体中。
我发现 Java 类 GoogleCredential 已被贬值,但 Google 的一些产品文档仍然引用它:https://cloud.google.com/java/docs/reference/google-api-client/latest/com.google.api.client.googleapis.auth.oauth2.GoogleCredential。
下面是我用 C# 开发的 sn-p 代码,但我找不到任何类似的方式在 Java 中调用这个类:
using Google.Apis.Auth.OAuth2;
var cred = GoogleCredential.FromJson(*[myjsonkey]*).CreateScoped(new string[] { "https://www.googleapis.com/auth/analytics.readonly" });
var token = await cred.UnderlyingCredential.GetAccessTokenForRequestAsync();
Java 类 GoogleCredential 现已完全弃用(链接如下:https://cloud.google.com/java/docs/reference/google-api-client/latest/com.google.api.client.googleapis.auth.oauth2.GoogleCredential#com_google_api_client_googleapis_auth_oauth2_GoogleCredential_createDelegated_java_lang_String_)
任何关于我如何模仿在 Java 中使用等效的 GoogleCredential 类来返回 JWT 的建议或示例都将不胜感激。
更新:我现在明白 com.google.api.client.googleapis.auth.oauth2.GoogleCredential 的替代品现在是 com.google.auth.oauth2.GoogleCredentials,但我不知道如何使用它通过传入从 Azure Key Vault 调用的 json 密钥,以便我可以返回 JWT。这是我到目前为止所构建的,调用 Azure Function key vault 并返回与我的服务帐户关联的 Google .json 机密文件。我收到一条 500 返回消息,因为我在响应中没有适当地调用 JWT。我引用了this part of Google auth library for java,但它不起作用。有什么技巧可以调整我的代码???
package GetOAuthFunction;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.*;
import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.*;
import com.azure.security.keyvault.secrets.SecretClient;
import com.azure.security.keyvault.secrets.SecretClientBuilder;
import com.azure.security.keyvault.secrets.models.KeyVaultSecret;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.gson.*;
/**
* Azure Functions with HTTP Trigger, getting value from Key Vault, returning Google Analytics Access Token in get request return body
*/
public class HttpKeyVaultFunc {
@FunctionName("GetGoogleAnalyticsOAuthToken")
public HttpResponseMessage run(
@HttpTrigger(
name = "req",
methods = {HttpMethod.GET},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
final ExecutionContext context) {
context.getLogger().info("Java HTTP trigger processed a request.");
String secret = System.getenv("KEY_VAULT_URL");
SecretClient secretClient = new SecretClientBuilder()
.vaultUrl(secret)
.credential(new DefaultAzureCredentialBuilder().build())
.buildClient();
KeyVaultSecret retrievedSecret = secretClient.getSecret("clientsecret");
String clientsecretvalue = retrievedSecret.getValue();
JsonObject clientsecretarray = new Gson().fromJson(clientsecretvalue, JsonObject.class);
GoogleCredentials credentials = GoogleCredentials.fromStream(clientsecretarray).createScoped(new String {"https://www.googleapis.com/auth/analytics.readonly"}) ;
return request.createResponseBuilder(HttpStatusOK).body("Access Token: "+ credentials.getAccessToken().build());
}
}
【问题讨论】:
标签: java azure jwt azure-functions google-api-java-client