gpt4 book ai didi

java - 在 Java 中创建 JSON Web token

转载 作者:搜寻专家 更新时间:2023-11-01 03:39:01 25 4
gpt4 key购买 nike

我正在尝试创建一个 JSON Web token ,以便使用它通过 Google Analytics API 访问进行刷新 token 调用。我采用了服务帐户方法。

按照这种方法,我需要:

  1. 创建服务帐号
  2. 使用 Google Analytics 帐户添加为 Analytics 应用程序创建的电子邮件地址。
  3. 下载私钥文件(.p12)
  4. 使用此私钥和电子邮件地址构建 JWT,随后用于对 google auth 服务器进行 HTTP POST 调用以获得刷新 token 。

我不确定我创建 JWT 的方法是否正确。 Google Code 站点上作为 JWT_Handler.java 提供的示例讨论了如何创建带有声明部分的 JWT 以及仅缺少 header 和签名部分的请求负载。这与为刷新 token 创建 JWT 的谷歌指南混淆,其中 JWT 涉及三个部分:

  1. JWT header
  2. JWT 声明
  3. 签名

这三部分都是Base64Url编码的。我尝试了以下代码:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.nio.charset.Charset;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Signature;
import java.util.Calendar;
import java.util.Enumeration;

import com.google.api.client.util.Base64;
import com.google.gson.JsonObject;
public class TestJWT {

private final static Charset UTF8_CHARSET = Charset.forName("UTF-8");
private static KeyStore myStore = null;
private static FileInputStream in_cert = null;
public static void main(String[] args) {
PrivateKey privateKey = null;
try {
in_cert = new FileInputStream(
"D://Google Analytics//ClientLogin//Analytics//%$%%$%$%-privatekey.p12");

} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
myStore = KeyStore.getInstance("PKCS12");
myStore.load(in_cert, "notasecret".toCharArray());
String alias = "";
Enumeration objEnumeration = myStore.aliases();
while (objEnumeration.hasMoreElements() == true) {
alias = (String) objEnumeration.nextElement();
privateKey = (PrivateKey) myStore.getKey(alias,
"notasecret".toCharArray());
}
} catch (Exception e1) {
e1.printStackTrace();
}

JsonObject header = new JsonObject();
header.addProperty("alg", "RS256");
header.addProperty("typ", "JWT");

Calendar cal = Calendar.getInstance();
cal.set(1970, 01, 01);
String iat = Long.toString((System.currentTimeMillis() - cal.getTimeInMillis())/1000);
String exp = Long.toString((System.currentTimeMillis() - cal.getTimeInMillis())/1000 + 60000L);

JsonObject claim = new JsonObject();
claim.addProperty("iss", "$$%$^%&^!%@#$@developer.gserviceaccount.com");
claim.addProperty("scope", "https://www.googleapis.com/auth/devstorage.readonly");
claim.addProperty("aud", "https://accounts.google.com/o/oauth2/token");
claim.addProperty("access_type", "offline");
claim.addProperty("exp", exp);
claim.addProperty("iat", iat);


System.out.println("Header : " + header);
String headerStr = header.toString();
System.out.println("claim : " + claim);
String claimStr = claim.toString();


try {

byte[] headerArr = headerStr.getBytes(UTF8_CHARSET);
System.out.println(Base64.encodeBase64String(headerArr));

byte[] claimArr = claimStr.getBytes(UTF8_CHARSET);
System.out.println(Base64.encodeBase64String(claimArr));

String inputStr = Base64.encodeBase64String(headerArr) + "." + Base64.encodeBase64String(claimArr);

System.out.println("Input String : " + inputStr);
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(inputStr.getBytes(UTF8_CHARSET));
System.out.println("Sign : " + signature.sign());

System.out.println("Base64url encoded sign : " + Base64.encodeBase64String(signature.sign()));

System.out.println("Final JWT : " + Base64.encodeBase64String(headerArr) + "." + Base64.encodeBase64String(claimArr) + "." + Base64.encodeBase64String(signature.sign()));

} catch (Exception e) {
e.printStackTrace();
}
}

}

最佳答案

Prathamesh,这个问题和你的其他帖子是同一个问题吗? ( Making Refresh Token Request In Java With JWT through a stand alone application - Not a Web App )

澄清一下,使用 P12 文件签署 JWT 将使您获得访问 token (而不是刷新 token )。没关系,因为访问 token 是您进行后续 API 调用所需要的。

我强烈建议使用 Google 的 Java 客户端库来构建 JWT 并进行签名,您已经在另一篇文章中粘贴了一个很好的示例:

GoogleCredential credentialGA = new GoogleCredential.Builder().setTransport(httpTransport)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId("$#$@#$#$#$@developer.gserviceaccount.com")
.setServiceAccountScopes(Collections.singleton(AnalyticsScopes.ANALYTICS_READONLY))
.setServiceAccountPrivateKeyFromP12File(new File("$#$#$%$%$%$-privatekey.p12"))
.build();
this.analytics = new Analytics.Builder(httpTransport, JSON_FACTORY, credentialGA).setApplicationName("Demo App").build();

是否有您不想使用客户端库的特定原因?它将负责创建 JWT、对其进行签名、发送、构建服务请求、添加授权 header 、在访问 token 过期时刷新访问 token 等。

关于java - 在 Java 中创建 JSON Web token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20002372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com