2017-05-20 1 views
0

Google 또는 Microsoft에서 openid id_token을 요청하고 동의를 통해 openid 범위에 대한 내 앱 요청에 동의 한 후 id_token이 정식으로 반환됩니다. 점과 두 부분을 나눌 수 있는데 유효한 JSON으로 디코딩 할 수 있으므로 JWT이므로 의심의 여지가 없습니다. 내가 [Authorize] 주석 것 aspnetcore의 WebApi 방법에 대한 요청의 인증 헤더에서 무기명 토큰으로 사용하려고 할 때신선하지만 잘못된 id_token

는하지만,이 헤더로, 401 UNAUTH을 얻을 :

WWW-Authenticate: Bearer error=invalid_token, error_description="The signature is invalid" 

것 같다 Microsoft와 Google이 모두 불량 JWT를 발행하고 있다고 생각하지 않습니다. 그래서 지금 현재하고 다음과 같이 설정되어 미들웨어에서이 반응을 일으킬 수 있는지 알아야합니다 그것은 중요한

app.UseJwtBearerAuthentication(new JwtBearerOptions { SaveToken = true }); 

경우에는 여기에서 토큰 요청에 대한 내 편집 됨 PARAMS입니다.

"uri": "https://accounts.google.com/o/oauth2/auth", 
    "parameters": { 
    "request_type": "token", 
    "response_type": "id_token", 
    "client_id": "REDACTED.apps.googleusercontent.com", 
    "redirect_uri": "https://REDACTED/", 
    "scope": "openid", 
    "state": "STATE", 
    "nonce": "wibble", 
    "allow_signup": "true" 
    } 

분명히 상태와 넌스는 안정된 더미 값입니다.

그래서 잘못된가요? WTF? 내 코드로 캡처 한대로 토큰을 확인하기 위해 http://jwt.io을 사용해 보았지만 불행한 것처럼 보였습니다. 헤더와 페이로드가 디코딩되었지만 서명을 검증하는 방법이 명확하지 않아 더 많은 값을 원했고 어디에서 얻을 수 있는지 분명하지 않았습니다. 그것에 대한 안내가 도움이 될 수 있습니다.

여기에 토큰을 추출했습니다.

eyJhbGciOiJSUzI1NiIsImtpZCI6IjJiMmU0ZDZmMTgyMWFkNGQ3NmQ0NTUzYzk1MWI3NTYyMmFjYjY1MzkifQ.eyJhenAiOiI3ODg4NTA3NTgwMTItdTUwbnVkMDU0aDJsNDIxOXRlaXYxbzU4Mzg5am1iNnAuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJhdWQiOiI3ODg4NTA3NTgwMTItdTUwbnVkMDU0aDJsNDIxOXRlaXYxbzU4Mzg5am1iNnAuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzdWIiOiIxMTU2NTI3NjAwMDUzMDY1MDIxNTAiLCJub25jZSI6IndpYmJsZSIsImlzcyI6ImFjY291bnRzLmdvb2dsZS5jb20iLCJpYXQiOjE0OTUyNTA0MzcsImV4cCI6MTQ5NTI1NDAzN30.Mb3E32cVeJ4dvPw-Fpj5j1GwXIFzwTaa0fvSEh7YjvR3d18hC8_G0avWYGNb6CoJzasZnsSGDLDi_s0Cfpiov0ZBoJVap69udkR1RiTbOc-WxcgtimflG80LwpPpNepEjuJfF1i1OwIFSputpXKbFQOsTP5fN4Xe7cE-EjTrHVX8zzR2v31pqrjh1o5HSK2QEQXM7eEYYvJrDMpgjtL5r22DoQdPHCZgt1Wi3XnTRn_MCD8zWX99Z6n11TpD6IWxlgzBCItlrr6nXRv1Np9ti2Mvw7p0-gCmpFiJKD60J34aqB1AJUpPFXuZWpV--KTTA3T55rC2lRg6vSueeK6QoQ 

귀하의 편의를 위해 다시 점이 찍혀 있습니다.

eyJhbGciOiJSUzI1NiIsImtpZCI6IjJiMmU0ZDZmMTgyMWFkNGQ3NmQ0NTUzYzk1MWI3NTYyMmFjYjY1MzkifQ 

eyJhenAiOiI3ODg4NTA3NTgwMTItdTUwbnVkMDU0aDJsNDIxOXRlaXYxbzU4Mzg5am1iNnAuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJhdWQiOiI3ODg4NTA3NTgwMTItdTUwbnVkMDU0aDJsNDIxOXRlaXYxbzU4Mzg5am1iNnAuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzdWIiOiIxMTU2NTI3NjAwMDUzMDY1MDIxNTAiLCJub25jZSI6IndpYmJsZSIsImlzcyI6ImFjY291bnRzLmdvb2dsZS5jb20iLCJpYXQiOjE0OTUyNTA0MzcsImV4cCI6MTQ5NTI1NDAzN30 

Mb3E32cVeJ4dvPw-Fpj5j1GwXIFzwTaa0fvSEh7YjvR3d18hC8_G0avWYGNb6CoJzasZnsSGDLDi_s0Cfpiov0ZBoJVap69udkR1RiTbOc-WxcgtimflG80LwpPpNepEjuJfF1i1OwIFSputpXKbFQOsTP5fN4Xe7cE-EjTrHVX8zzR2v31pqrjh1o5HSK2QEQXM7eEYYvJrDMpgjtL5r22DoQdPHCZgt1Wi3XnTRn_MCD8zWX99Z6n11TpD6IWxlgzBCItlrr6nXRv1Np9ti2Mvw7p0-gCmpFiJKD60J34aqB1AJUpPFXuZWpV--KTTA3T55rC2lRg6vSueeK6QoQ 

이 사람은 분명, 지금은 만료되어 있지만이 서명을 확인하는 방법을 알고 있다면 그것은 내가 그것을 추출 토큰을 손상 여부를 확인하기위한 편리 할 수 ​​있습니다. 누구나 무엇이 잘못되었고 어떻게 처리해야하는지 이해하도록 도와 줄 수 있습니까?

아래의 한스의 대답은 같지만 현실은 문서와 일치하지 않는 것 같습니다. 그렇다면 나는이 질문을 MSFT 사람이 대답하는 Microsoft Account OpenID authentication token request returns id_token but not access_token으로 발견했습니다. 범위를 요청했을 때만 인증 토큰을받는 것 같습니다. 이것은 의미가 있습니다. auth 토큰은 토큰 요청에 지정된대로 하나 이상의 자원에 대한 액세스 권한을 부여합니다. 내 요청에 지정된 유일한 범위는 수신 된 id_token에 대한 요청 인 openid입니다.

하지만 사용자의 주소록이나 이메일과 같은 공급자 범위에 대한 작업 권한을 얻으려고하지 않습니다. 공급자에게 인증을 위임하려고합니다. 허가가 아닙니다. 사용자의 신원을으로 설정하고 싶습니다. 내가 이해할 수있는 점은 id_token입니다. 본질적으로 애플리케이션 별 범위를 정의하는 사용자 역할의 자체 데이터베이스를 사용하여 자체 승인을하고 싶습니다.

답변이 관련 문서에 대한 링크로 지원되는 aspnetcore 웹 API를 사용하는 방법에 대한 간략한 스케치 인 경우에도 여전히 대답할만한 질문이라고 생각합니다.

OAuth 2 access_token vs OpenId Connect id_token 이것은 지원되는 시나리오임을 분명히합니다. 여기에서 중요한 문구는 SSO 또는 싱글 사인온입니다. 나는 이것이 aspcorenet webapi를 사용하는 SPA에 대해 SSO에 대해 어떻게 가야할지에 대한 질문이라고 생각하기 시작했습니다.

그러나 원래의 질문 : 이러한 토큰에 왜 서명이없는 것 같습니까?

답변

0

Google 및 Microsoft에서 지원하는 OpenID Connect 플로우에서 인증 요청에 대한 응답으로 id_tokenaccess_token이 표시됩니다. id_token은 클라이언트 (예 : 애플리케이션)에 대한 사용자 인증에 사용되며 access_token은 API 액세스에 사용될 수 있습니다.

따라서 id_token 대신 API 호출의 Authorization: bearer <token> 헤더에 access_token을 제공해야합니다.

관련 문제