简体   繁体   English

解码java google oauth2.0 JWT

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM