2013-11-23 4 views
32

내 노드 익스프레스 앱에서 사용자를 인증하기 위해 Google OAuth를 사용하려고 여기에서 시간을 보내고 있습니다.노드 앱에서 Google OAuth 2.0 JWT (OpenID Connect)를 어떻게 디코딩 할 수 있습니까?

{ 
    access_token: 'token string', 
    id_token: 'id.string', 
    expires_in: 3599, 
    token_type: "Bearer" 
} 

이 모두 의미가 있습니다,하지만 난 내 인생의 JWT를 디코딩하는 방법을 알아낼 수 없습니다 : 나는 성공적 그래서 같은 응답을 반환하여 OAuth를 할 수있다. 나는이 모든 것에 경험이없는 약간의 사람이다. 그래서 이것은 나에게 외국의 누구나 이어도.

여기에 나열된 지침을 따르십시오 : https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken 내 노드 응용 프로그램에서 JWT를 로컬에서 디코딩하려고합니다.

내 노드 환경에 https://github.com/hokaccha/node-jwt-simple을 설치했습니다.

그리고 저는이 인증서 (https://www.googleapis.com/oauth2/v1/certs)를 어떻게 든 디코드 할 때 사용할 필요가 있다고 확신합니다. 그러나 여기에 약간의 손실이 있습니다. 나는 정말로 내 노드 응용 프로그램에 인증서를 가져 오는 방법을 이해하지 못한다. 그리고 그 후에 node-jwt-simple과 함께 사용하는 방법을 이해해야한다. 또한 캐시 된 인증서를 사용하는 것과 비교하여 새로운 인증서를 가져와야하는시기를 어떻게 알 수 있는지 이해하지 못합니다.

나에게 도움이 될 수있는 경험이있는 사람이 있습니까?

도움 주셔서 감사합니다. 나는이 시점에서 완전히 실패하고있다.

** 업데이트 **

그래서 몇 가지 진전을 보였습니다. jwt.decode (id_token, certificate, true)를 호출함으로써; 토큰을 성공적으로 디코딩 할 수 있습니다. 인증서 var가 빈 객체 인 경우에도 {}. 이것은 여전히 ​​3 가지 질문을 남겨 둡니다. 1 : google에서 URL을 사용하여 익스프레스 앱으로 인증서를 가져 오는 가장 좋은 방법은 무엇입니까? 2 : 새로운 버전을 가져와야 할 때 어떻게 알 수 있습니까? 3 : noVerify (jwt.decode의 세 번째 인수)에 대해 true를 전달하는 것처럼 보이는 것이 끔찍한 생각입니다. 어떻게하면 그것을 통과시키지 않고 일하게 할 수 있습니까? 아마도 jwt-simple은 hs256을 기대하고 있고 토큰은 rs256을 사용하고있는 것처럼 보입니다.

다시 말하지만, 저는 여기에서 초보자입니다. 그래서 나는 여기서 벗어날 수 있습니다.

* 업데이트 * Nat의 도움 덕분에이 기능을 사용할 수있었습니다! 나는 모든 단일 JWT 및 JWS 노드 모듈을 거기에서 시도했다고 생각합니다. 내가 마침내 착륙 한 것은 다음과 같습니다 : 내가 본 모듈 중 아무 것도 내가 상자에서 원하는 것을 전혀하지 않는다는 것을 발견했습니다. id_token을 디코딩 할 때 사용하는 다음 jwt 디코딩 도우미 메서드를 만들었으므로 헤더에서 아이를 가져올 수 있습니다.

module.exports = { 
    decodeJwt: function (token) { 
    var segments = token.split('.'); 

    if (segments.length !== 3) { 
     throw new Error('Not enough or too many segments'); 
    } 

    // All segment should be base64 
    var headerSeg = segments[0]; 
    var payloadSeg = segments[1]; 
    var signatureSeg = segments[2]; 

    // base64 decode and parse JSON 
    var header = JSON.parse(base64urlDecode(headerSeg)); 
    var payload = JSON.parse(base64urlDecode(payloadSeg)); 

    return { 
     header: header, 
     payload: payload, 
     signature: signatureSeg 
    } 

    } 
} 

function base64urlDecode(str) { 
    return new Buffer(base64urlUnescape(str), 'base64').toString(); 
}; 

function base64urlUnescape(str) { 
    str += Array(5 - str.length % 4).join('='); 
    return str.replace(/\-/g, '+').replace(/_/g, '/'); 
} 

난에서 새 공용 인증서에 끌어 할 필요가 있는지 확인하기 위해 디코딩을 사용하고 있습니다 : 내가 사용하고 그 다음 https://www.googleapis.com/oauth2/v1/certs

이 공개 인증서와 노드 JWS (https://github.com/brianloveswords/node-jws) jws.verify (id_token , cert) 서명을 확인하십시오!

만세! 답변에 대한 추가 설명을 보내 주셔서 감사합니다. 그게 내가하는 일을 이해하는 데 도움이되었다. 이것이 다른 사람들에게도 도움이되기를 바랍니다.

답변

48

사양의 관점에서 볼 때, [OpenID Connect]가 발생했습니다.

id_token은 [JWS] 서명 된 [JWT]입니다. 이 경우, 그것은 "." 세 가지 구성 요소로 구분 된 문자열. 첫 번째 부분은 헤더입니다. 두 번째는 페이로드입니다. 세 번째는 서명입니다. 각각 Base64url로 인코딩 된 문자열입니다.

머리글을 디코딩 할 때, 당신은 같은 것을 얻을 것이다 :

{ "ALG": "RS256", "아이": "43ebb53b0397e7aaf3087d6844e37d55c5fb1b67는"}

는 "ALG는"서명 알고리즘을 나타냅니다 [JWA]에 정의 된 RS256입니다. "kid"는 서명에 사용 된 키에 해당하는 공개 키의 키 ID를 나타냅니다.

지금 나는 당신의 몇 가지 질문에 대답 할 준비가 :

2 : 어떻게 내가 그것의 새로운 버전을 끌어해야 할 때 알 수 있습니까?

캐시 된 cert 파일의 아이 ([JWK] 파일)가 헤더의 아이와 일치하지 않으면 새 인증서 파일을 가져옵니다. (BTW, 당신은 인증서 표시를 끌어있는 URL이라고 x5u.)

3 : 그것은 끔찍한 생각이다 (jwt.decode에서 세번째 인수를) noVerify에 true를 전달처럼 보인다. 을 전달하지 않고 어떻게 작동시킬 수 있습니까?

실제로. 아마도 당신은 kjur.github.io/jsjws/와 같은 다른 라이브러리를보고 싶을 것입니다. openid.bitbucket.org/openid-connect-core-1_0.html

참조

  • [오픈 아이디 접속]
  • [JWS] tools.ietf.org/html/draft-ietf- 호세-JSON 웨브 서명
  • [JWT]
  • [JWK] tools.ietf.org/html/draft-ietf tools.ietf.org/html/draft-ietf-oauth-json-web-token -autaut-json-web-keys
  • [JWA] tools.ietf.org/html/draft-ietf-j ose-json-web-algorithms
+0

굉장! 철저하고 자세한 설명을 해주셔서 감사드립니다. 이것은 제가 뭘하려고했는지에 대한 제 이해에 대단히 도움이되었습니다. 그리고 이제 나는 더 이상 질문이있을 때 내가 무엇을 찾고 있어야 하는지를 안다. 정말 감사. – ThePuzzleMaster