json解码JavaGoogleOAuth2。0 JWT
我正在尝试使用下面的stmts解码google oauth token_id。。由于某些原因,这些声明被部分解码
String token = "eyJhbGciOiJSUzI1NiIsImtpZCI6IjdkZGQwOGEwM2IyNWQwZjVhMDllMjNiMmJlMTBkZDIyODQyYTg1NjkifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwic3ViIjoiMTAxOTI0MjQ2MzYwNDM0OTY2NzMzIiwiYXpwIjoiNTk0OTU1MjgxODg2LWJxcjBkYm1kcmFicWFvbm1oZWlxazBza2RkZjVhbGs1LmxCLTO3GHRBn0";
//String[] jwtParts = token.split("\\.");
String[] base64EncodedSegments = token.split("\\.");
System.out.println(Arrays.toString(base64EncodedSegments));
String base64EncodedHeader = base64EncodedSegments[0];
String base64EncodedClaims = base64EncodedSegments[1];
byte[] claims = new byte[1000000];
claims = DatatypeConverter.parseBase64Binary(base64EncodedClaims);
String s = new String(claims);
System.out.println(s);
System.out.println(s.getClass().getName());
JSONObject emailobject = new JSONObject(s);
String emailid = emailobject.getString("email");
System.out.println(emailid);
已解码的声明如下:
它以“{”括号开始,但不以“}”结尾,因此我无法转换为JSON对象并获取实际的电子邮件id
{"iss":"accounts.google.com","sub":"101924246360434966733","azp":"594955281886-bqr0d0skddf5alk5.apps.googleusercontent.com","email":"test@gmail.com","at_hash":"dVrka2339w4Cezz32ssrY_w","email_verified":true,"aud":"594955281-bqr0dbmdrak5.apps.googleusercontent.com","iat":1423238546,"exp":1413223244
**********更新************
这段代码用于连接到GoogleOAuth并检索电子邮件id
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource webResource = client.resource(UriBuilder.fromUri("https://accounts.google.com/o/oauth2/token").build());
MultivaluedMap formData = new MultivaluedMapImpl();
formData.add("code", request.getParameter("code"));
formData.add("client_id", Global.GOOGLE_CLIENT_ID);
formData.add("redirect_uri", Global.GOOGLE_REDIRECT_URL);
formData.add("client_secret", Global.GOOGLE_SECRET);
formData.add("grant_type", "authorization_code");
ClientResponse response1 = webResource.type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(ClientResponse.class, formData);
JSONObject jobject = new JSONObject(response1.getEntity(String.class));
String token_id = jobject.getString("id_token");
String[] base64EncodedSegments = token_id.split("\\.");
String base64EncodedHeader = base64EncodedSegments[0];
String base64EncodedClaims = base64EncodedSegments[1];
JsonParser parser = new JsonParser();
JsonElement payload = parser.parse(StringUtils.newStringUtf8(Base64.decodeBase64(base64EncodedClaims)));
JSONObject emailobject = new JSONObject(payload.toString());
String emailid = emailobject.getString("email");
需要罐子-
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3</version>
</dependency>
# 1 楼答案
oauth2令牌使用Base64URL编码,但是
DatatypeConverter.parseBase64Binary()
解码标准Base64要将它们转换为标准Base64,必须将
-
转换为+
,将_
转换为/
,并添加填充字符=
,直到每个单独的Base64URL字符串(base64EncodedSegments[]
)为止。length()是4的倍数这将解决由于Base64URL字符串中不存在
=
填充字符而丢失的}
字符的问题# 2 楼答案
我还坚持你曾经面临的问题。最后,我找到了解决办法