有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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>

共 (2) 个答案

  1. # 1 楼答案

    oauth2令牌使用Base64URL编码,但是DatatypeConverter.parseBase64Binary()解码标准Base64

    要将它们转换为标准Base64,必须将-转换为+,将_转换为/,并添加填充字符=,直到每个单独的Base64URL字符串(base64EncodedSegments[])为止。length()是4的倍数

    这将解决由于Base64URL字符串中不存在=填充字符而丢失的}字符的问题

  2. # 2 楼答案

    我还坚持你曾经面临的问题。最后,我找到了解决办法

    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]));
    }