내 노드 익스프레스 앱에서 사용자를 인증하기 위해 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) 서명을 확인하십시오!
만세! 답변에 대한 추가 설명을 보내 주셔서 감사합니다. 그게 내가하는 일을 이해하는 데 도움이되었다. 이것이 다른 사람들에게도 도움이되기를 바랍니다.
굉장! 철저하고 자세한 설명을 해주셔서 감사드립니다. 이것은 제가 뭘하려고했는지에 대한 제 이해에 대단히 도움이되었습니다. 그리고 이제 나는 더 이상 질문이있을 때 내가 무엇을 찾고 있어야 하는지를 안다. 정말 감사. – ThePuzzleMaster