大佬教程收集整理的这篇文章主要介绍了如何使用 JAVA 使用 REST API 从服务帐户凭据创建访问令牌?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要在不使用 GCP Java 客户端库的情况下使用服务帐户凭据列出文件夹。 我需要使用 REST API 进行调用,因为使用 GCP Java 客户端库存在限制。 是否有任何示例或示例可以参考在 Java/Spring 中进行 REST API 调用?
你可以使用 RestTemplate 和这个依赖
<dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.14.0</version> </dependency>
@H_772_12@然后,阅读您的服务帐户 JSON 文件(这里是我的
key.json
文件)并享受!如果某些部分不清楚,请告诉我!InputStream resource = new ClassPathresource("key.json").geTinputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(resourcE)); String keyFileJson = reader.lines().collect(Collectors.joining("\n")); Map keyFile = new ObjectMapper().readValue(keyFileJson,Map.class); String privKeyPEM = keyFile.get("private_key").toString().replace("-----BEGIN PRIVATE KEY-----","") .replace("-----END PRIVATE KEY-----","") .replaceAll("\n",""); byte [] encoded = Base64.decode(privKeyPEM); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded); KeyFactory kf = KeyFactory.geTinstance("RSA"); PrivateKey privKey = kf.generatePrivate(keySpec); String tokenUrl = "https://oauth2.googleapis.com/token"; long now = System.currentTimeMillis(); Algorithm algorithm = Algorithm.RSA256(null,(RSAPrivateKey)privKey); String signedJwt = JWT.create() .withKeyId(keyFile.get("private_key_id").toString()) .withIssuer(keyFile.get("client_email").toString()) .withAudience(tokenUrl) .withClaim("scope","openid https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/appENGIne.admin https://www.googleapis.com/auth/compute") .withIssuedAt(new Date(now)) .withExpiresAt(new Date(now + 3600 * 1000L)) .sign(algorithm); // System.out.println(signedJwt); RestTemplate restTemplate = new RestTemplate(); httpHeaders headers = new httpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); MultiValueMap<String,String> map = new LinkedMultiValueMap<>(); map.add("assertion",signedJwt); map.add("grant_type","urn:ietf:params:oauth:grant-type:jwt-bearer"); httpEntity<MultiValueMap<String,String>> entity = new httpEntity<>(map,headers); ResponseEntity<String> responseEntity = restTemplate.postForEntity(tokenUrl,entity,String.class); Map result = new ObjectMapper().readValue(responseEntity.getBody(),Map.class); System.out.println(result.get("access_token"));
@H_772_12@
编辑 1
要生成并获取 ID_Token,如果您想生成令牌以调用以安全模式部署的 Cloud Run、Cloud Functions 或 App ENGIne,则需要此令牌。您需要用 target_audience URL 替换范围声明。最后,打印 id_token 而不是访问令牌
String signedJwt = JWT.create() .withKeyId(keyFile.get("private_key_id").toString()) .withIssuer(keyFile.get("client_email").toString()) .withAudience(tokenUrl) .withClaim("target_audience","https://target-log-fqffbf2xsq-uc.a.run.app") .withIssuedAt(new Date(now)) .withExpiresAt(new Date(now + 3600 * 1000L)) .sign(algorithm); ... ... ... System.out.println(result.get("id_token"));
@H_772_12@
以上是大佬教程为你收集整理的如何使用 JAVA 使用 REST API 从服务帐户凭据创建访问令牌?全部内容,希望文章能够帮你解决如何使用 JAVA 使用 REST API 从服务帐户凭据创建访问令牌?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。