2017-12-19 4 views
0

JWT 토큰을 사용하고 있으며 ByteBuffer라는 클레임 ​​중 하나가 있습니다. JWT가 성공적으로 생성되었지만 JWT 토큰을 구문 분석하고 클레임을 확인하려고하면 claimSet에 값이 없다는 오류가 발생합니다.ByteBuffer를 JWT 클레임으로 사용

여기에 내 코드가 보이는 방법은 다음과 같습니다 내가 볼 예외 메시지는 이것이다

 PlainJWT jwtToken = PlainJWT.parse(jwtToken); 
     ReadOnlyJWTClaimsSet claimsSet = jwtToken.getJWTClaimsSet(); 
     Map<String, Object> claims = claimsSet.getAllClaims(); 
     ByteBuffer encryptedText = (ByteBuffer) claims.get("myObject"); 

:

 ByteBuffer encryptedText = getEncryptedTextAsByteBuffer(); 

     Instant timestamp = timestampSupplier.get(); 
     JWTClaimsSet claimsSet = new JWTClaimsSet(); 
     claimsSet.setAudience("test-audience"); 
     claimsSet.setIssuer("test-issuer"); 
     claimsSet.setNotBeforeTime(Date.from(timestamp)); 
     claimsSet.setExpirationTime(Date.from(Instant.ofEpochSecond(expirationTimestamp))); 
     claimsSet.setClaim("myObject", encryptedText); 

     PlainJWT jwt = new PlainJWT(claimsSet); 
     return jwt.serialize(); 

유효성 검사 코드는 다음과 같습니다 내가 디버거를 추가

java.lang.ClassCastException: net.minidev.json.JSONObject cannot be cast to java.nio.ByteBuffer 

Jwt 세대에는 유효한 비어 있지 않은 ByteBuffer가 있지만 결과로 나오는 클레임에는 "myObject"k가 있음을 확인했습니다 ey하지만 값은 빈 json String입니다. 클레임을 byteBuffer로 사용할 수 없습니까? 아니면 내가 잘못하고있는거야?

도움을 주시면 감사하겠습니다.

+0

'claims.get ("인 myObject")''반환 JSONObject' 개체입니다하지만 당신은 여기에 코드를 작동하게하기 위해 만든 수정입니다 그것을 'ByteBuffer'로 캐스팅합니다. 'JSONObjectencryptedText = (JSONObject) claims.get ("myObject");'JSONObject가 포함하고있는 것을 보도록하십시오. – tsolakp

답변

1

ByteBuffer에는 바이너리 데이터가 들어 있지만 JSON은 텍스트 형식입니다. 기본 바이트 배열을 base64로 인코딩하고 JWT의 클레임으로 포함해야합니다.

저는 ByteBuffer에 새로운 것이므로 javadoc을 검토하여 작동 방식을 확인했습니다. 이것을 시도하십시오

// ByteBuffer to base64 
byte[] data = new byte[encryptedText.remaining()] 
encryptedText.get(data); 
String dataB64 = DataTypeConverter.printBase64Binary(data); 

//Add claim 
claimsSet.setClaim("myObject", dataB64); 

유효성을 검사하려면 base64에서 byte []로 변환하십시오. 이 경우에는 ByteBuffer가 필요하지 않지만 바이트 []에서 빌드 할 수 있다고 생각합니다.

String dataB64 = (String) claims.get("myObject"); 
byte data[] = DataTypeConverter.parseBase64Binary(dataB64) 
+0

'DataTypeConverter'을 사용하지 마십시오. 'java.util.Base64'를 사용하십시오. – erickson

0

그 대답이 도움이되었습니다. 유효성 검사 부분이 변경되었습니다

ByteBuffer encryptedText = getEncryptedTextAsByteBuffer(); 
    String encodedText = Base64.getEncoder().encodeToString(encryptedText .array()); 
    Instant timestamp = timestampSupplier.get(); 
    JWTClaimsSet claimsSet = new JWTClaimsSet(); 
    claimsSet.setAudience("test-audience"); 
    claimsSet.setIssuer("test-issuer"); 
    claimsSet.setNotBeforeTime(Date.from(timestamp)); 
    claimsSet.setExpirationTime(Date.from(Instant.ofEpochSecond(expirationTimestamp))); 
    claimsSet.setClaim("myObject",); 

    PlainJWT jwt = new PlainJWT(claimsSet); 
    return jwt.serialize(); 

:

PlainJWT jwtToken = PlainJWT.parse(jwtToken); 
    ReadOnlyJWTClaimsSet claimsSet = jwtToken.getJWTClaimsSet(); 
    String claim = (String)claimsSet.getClaim("myObject"); 
    byte[] emailBinary = Base64.getDecoder().decode(claim);