[英]decode java google oauth2.0 JWT
Im trying to decode the google oauth token_id using the below stmts..For some reason, the claims are decoded partially... 我正在尝试使用以下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);
Decoded claims below: 解码后的声明如下:
It starts with a "{" braces but does not close with "}" and because of that I'm unable to convert to a JSON object and get the actual email id 它以“ {”花括号开头,但未以“}”结尾,因此,我无法转换为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
***********Update************ ***********更新************
This piece of code works for to connect to google oauth and retrieve the email id... 这段代码适用于连接到Google oauth并检索电子邮件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");
Jars needed - 需要的罐子-
<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>
I also stuck with the same issue that you had faced. 我也坚持您遇到的相同问题。 Finally, I found a solution 最后,我找到了解决方案
private byte[] extract_email(JSONObject json) throws Exception {
String id_token = String.valueOf(json.get("id_token"));
String[] jwtParts = id_token.split("\\.");
return Base64.getDecoder().decode((jwtParts[1]));
}
The oauth2 tokens are encoded with Base64URL, however DatatypeConverter.parseBase64Binary()
decodes standard Base64. oauth2令牌使用Base64URL编码,但是DatatypeConverter.parseBase64Binary()
解码标准Base64。
To convert them into standard Base64 you'll have to turn -
into +
, _
into /
and appending padding chars =
until each of the separate Base64URL-Strings ( base64EncodedSegments[]
) String.length() is a multiple of 4. 以将它们转换成标准的Base64你将不得不转-
到+
, _
入/
并追加填充字符=
直到每个单独Base64URL串(的base64EncodedSegments[]
)string.length减()是4的倍数。
This should fix your problem with the missing }
char which was lost due to the non-existent =
padding chars in Base64URL Strings. 这应该可以解决由于缺少}
字符而导致的问题,该字符由于Base64URL字符串中不存在=
填充字符而丢失。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.