1

나는 Google's OpenIDConnect authentication을 사용하고 있으며 Google에서 반환 한 JWT id_token의 유효성을 검사하고 싶습니다. 그러나 ID 토큰에서 iss (발급자) 소유권 주장에 대해 Google이 반환하는 가치에 대한 문서가 일치하지 않는 것으로 보입니다. 하지만 another page "는 ID 토큰 ISS의 값은 accounts.google.com 또는 https://accounts.google.com 같다"및 예제 코드에 주석 추가 설명 말한다 :Google OpenIDConnect id_token에 대해 일관된 'iss'값을 얻을 수 있습니까?

One page는 " 항상 accounts.google.com ISS"라고

Android 앱이 아닌 서버 측 애플리케이션이 있으므로 Play 서비스를 사용하지 않습니다.

, the OpenIDConnect specification itself는 메모를 포함

더 물을 진흙하려면 그 :

구현 자가 인식 할 수 필요한 생략이 글을 쓰는 시점 기준으로, 구글의 전개 오픈 ID 연결 구현 문제의 ID 토큰, 그 https : // iss (issuer) 청구 값의 scheme 접두사. 따라서 Google과 협력하고자하는 의존 당사자 구현은 해당 구현이 업데이트 될 때까지이 문제를 해결하는 코드가 있어야합니다. 이러한 회피 코드는 누락 된 접두사를 발급자 값에 추가하는 시점에서 중단되지 않는 방식으로 작성되어야합니다.

문서가 그 이후 시간에 11 월 8 일 2014 년하는지

, 구글은 iss 값을 표준화, 또는 정말 둘 다 확인해야합니까했다? 위의 설명은 Play 서비스> = 8.3 만 isshttps://으로 가져오고 다른 모든 값은 accounts.google.com이 될 것임을 나타냅니다. 그게 사실이야?

답변

0

처음에는 Google의 문서가 어두운 비즈니스라는 데 동의합니다.

서버 측의 ID 토큰의 무결성을 검증 할 수있는 다른 몇 가지 방법이있다 (BTW this 당신이 찾고있는 페이지가) 있습니다

:

  1. "수동으로"- 계속 Google의 공개 키를 다운로드하고 서명을 확인한 다음 iss을 포함하여 모든 필드를 확인합니다. 주요 장점 (비록 작은 의견이지만 내 생각에)은 Google에 전송 된 요청 수를 최소화 할 수 있다는 점을 알고 있습니다.
  2. 은 "자동으로"- 간단한 지금까지 -이 토큰을 확인하기 위해 구글의 엔드 포인트에 GET을 수행 https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}
  3. 구글 API 클라이언트 라이브러리를 사용하여 - 오버 헤드가 가치가 없을 수도 C# 공식이 없습니다 하나 등

두 번째 옵션으로 가서 Google이 유효성 검사 알고리즘을 걱정하게하는 것이 좋습니다.

+0

그 페이지에는 현재 "ID 토큰의 iss 값은'accounts.google.com' 또는'https : // accounts.google.com'과 같습니다." –

+0

동의; 만약 당신이 그 길을 가면 아마도 두 가지 가능성을 모두 확인해야 할 것입니다. –

+1

덕분에, 내 질문에 답을주지 못했습니다. 왜냐하면 일반적으로 Google의 'id_token'을 확인하는 방법에 대해 이야기하기 때문입니다. 나는 'iss'필드에 대해 구체적으로 묻고있다. "아니오, 일관된 가치를 얻을 길이 없습니다. 두 가지 가능성을 확인해야합니다." – bjmc

0

두 가지 가능성을 모두 확인해야합니다. 이것은 나를 위해 일한 것입니다 ...

발급자를 얻으려면 토큰을 디코딩하십시오. 발급자가 https://accounts.google.com 또는 accounts.google.com 중 하나와 같지 않으면 거기에서 멈출 수 있습니다. 유효하지 않은 토큰입니다.

발급자가 위의 Google 문자열 중 하나와 동일한 경우 동일한 디코딩 된 발급자 값을 검증 단계로 전달합니다. 이 기능은 jsonwebtokenjwk-to-pem 노드 모듈을 사용

function authorize(req, res, next) { 
    try { 
     var token  = req.headers.authorization; 
     var decoded  = jwt.decode(token, { complete: true }); 
     var keyID  = decoded.header.kid; 
     var algorithm = decoded.header.alg; 
     var pem   = getPem(keyID); 
     var iss   = decoded.payload.iss; 

     if (iss === 'accounts.google.com' || iss === 'https://accounts.google.com') { 
      var options = { 
       audience: CLIENT_ID, 
       issuer: iss, 
       algorithms: [algorithm] 
      } 

      jwt.verify(token, pem, options, function(err) { 
       if (err) { 
        res.writeHead(401); 
        res.end(); 
       } else { 
        next(); 
       } 
      });    

     } else { 
      res.writeHead(401); 
      res.end(); 
     } 
    } catch (err) { 
     res.writeHead(401); 
     res.end(); 
    } 
} 

참고 : 다음

내가 어떤 Node.js를 익스프레스 미들웨어 자바 스크립트에 쓴 구현입니다. 궁극적으로 json 웹 키를 pem 형식으로 변환하는 getPem 함수의 세부 사항을 생략했습니다.