JWT 인증 절차

TEST

2024.04.01읽음 110

라이브러리 추가 없이 작업을 진행 하고 있습니다.
rsa 암호화 과정에서 어떤 이슈가 있는지
{"error_description":"Unexpected error occurred while parsing jwt.","error":"server_error","error_uri":"See document on https://developers.worksmobile.com/docs/auth-jwt"}
이라는 이슈가 발생하고 있습니다.

// claim 생성

String claim = String.format("{\"iss\":\"%s\",\"sub\":\"%s\",\"iat\":%d,\"exp\":%d}", client_id, service_account, iat, exp);

//String claim = String.format("{\"iss\":\"%s\",\"sub\":\"%s\",\"iat\":%d,\"exp\":%d}", "abcd", "46c4f281f81148c9b846c59262ae5888@example.com", 1634711358, 1634714958);

String base64_claim = Base64.getEncoder().encodeToString(claim.getBytes());


String jwt = String.format("%s.%s",base64_header,base64_claim);


// 암호화 키 조회

StringBuilder contentBuilder = new StringBuilder();

try (BufferedReader br = new BufferedReader(new FileReader(application.getRealPath("jwt_test.key")))) {

String line;

while ((line = br.readLine()) != null) {

contentBuilder.append(line).append("\n");

}

} catch (IOException e) {

e.printStackTrace();

}

String privateKeyString = contentBuilder.toString();


// 암호화 키 생성

byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyString.replaceAll("-----BEGIN PRIVATE KEY-----", "").replaceAll("-----END PRIVATE KEY-----", "").replaceAll("\\s+", ""));

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

PrivateKey privateKey = keyFactory.generatePrivate(keySpec);


// 암호화

Signature signature = Signature.getInstance("SHA256withRSA");

signature.initSign(privateKey);

signature.update(jwt.getBytes());

byte[] signatureBytes = signature.sign();


// base64 인코딩

String encodedSignature = Base64.getEncoder().encodeToString(signatureBytes);


// jws 생성

String jws = jwt + "." + encodedSignature;

정상적으로 진행 한 것 같은데, 어디에서 문제인지 확인 부탁드립니다.

댓글3

  • 업데이트 된 답글입니다.

    Steve_

    JWT 구문 에러라 코드만 봤을때는 정확히 어디가 잘못된 것인지 파악이 어렵네요.
    바로 찾기는 어려워 보여 전자서명 암호화 전에.. 에러 코드에 딸린 문서를 참고하셔서 JWT 형식에 만족되었는지.. 헤더 RS256 정의되었는지와 BASE64 인코딩 등 순차적으로 다시 점검해보셔야 할 것 같습니다. ㅠㅠ

    2024.04.01

    0
  • 업데이트 된 답글입니다.

    TEST 작성자

    docs 에서 제공하는 예제의 비밀 키는 공개가 안되는 부분일까요?
    정상적으로 전자서명 암호화가 되고 있는지 우선적으로 확인이 필요할 것 같네요.
    말씀하신 헤더나, 본문 값은 정상적으로 인코딩 되고 있는 것 같습니다.

    2024.04.01

    0
  • 업데이트 된 답글입니다.

    TEST 작성자

    이유는 찾았네요.
    claim을 base64 인코딩 할 때, 뒤에 =이 자동으로 붙는데, 제거해줘야 하고.
    전자서명 후, = 제거, + 는 -로, /는 _로 변경해줘야 하네요.

    2024.04.01

    0
이전 글oAuth 방식으로 인증 시 Refresh Token 마지막에 이상한 값이 추가되어 반환됩니다.
다음 글API 2.0 기준 Bot 메시지 전송 오류관련 문의 드립니다.
목록

궁금한 점을 해결하지 못하셨나요?
지금 바로 NAVER WORKS 사용자들에게 물어보세요!