리소스 서버에 대한 OAuth 2.0 액세스 토큰의 유효성을 검사하는 방법은 무엇입니까?


147

클라이언트가 리소스 서버에 OAuth 2.0 액세스 토큰으로 보호 된 리소스를 요청하면이 서버는 어떻게 토큰의 유효성을 검사합니까? OAuth 2.0 새로 고침 토큰 프로토콜?


서버는 이전에 발행 한 토큰의 유효성을 검사 할 수 있어야합니다. 일반적으로 데이터베이스 조회 또는 암호화 (자체 서명 토큰)입니다.
Thilo

내가 참조. 이 경우 리소스 소유자 WS와 클라이언트 WS가 모두 다른 장치에 있습니까?
Ack

5
인증 서비스와 리소스 서비스를 의미합니까? (클라이언트 / 소비자는 항상 다른 장치에 있으며 토큰 자체를 확인할 수 없습니다.)이 경우 "비싼"새로 고침 토큰을 사용하여 인증 서버 만 할 수 있지만 오래 지속되며 자주 만료되고 오프라인으로 확인할 수있는 액세스 토큰.
Thilo

답변:


97

2015 년 11 월 업데이트 : 아래 Hans Z.에 따르면, 이것은 실제로 RFC 7662의 일부로 정의됩니다 .

원래 답변 : OAuth 2.0 사양 ( RFC 6749 )은 액세스 토큰 (AT) 유효성 검사를 위해 RS (Resource Server)와 AS (Authorization Server) 간의 상호 작용을 명확하게 정의하지 않습니다. 그것은 실제로 AS의 토큰 형식 / 전략에 달려 있습니다. 일부 토큰은 자체적으로 포함되어 있으며 ( JSON Web Tokens 과 같은 ) 다른 토큰 은 AS에서 서버 측에 보유한 정보를 참조한다는 점에서 세션 쿠키와 유사 할 수 있습니다.

이 있었다 논의 는 RS는 AT의 검증을 위해 AS와 통신하기위한 표준적인 방법을 만드는에 대한 OAuth는 워킹 그룹이다. : 우리 회사 (핑 신원은) 우리의 상업 OAuth를 AS (PingFederate)에 대한 하나의 접근 방식에 도달했습니다 https://support.pingidentity.com/s/document-item?bundleId=pingfederate-93&topicId=lzn1564003025072.html#lzn1564003025072__section_N10578_N1002A_N10001 . OAuth 2.0을 보완하는 REST 기반 상호 작용을 사용합니다.


Scott T, Ping Federate의 기능을 활용하는 방법에 대한 코드 샘플을 볼 수있는 방법이 있습니까?
JavaHead

2
@JavaHead 여기에 우리의 개발자 웹 사이트에 덮여 좀 더 프로토콜 세부 사항이 있습니다 : developer.pingidentity.com/en/resources/... , 토큰의 유효성을 확인하는 소스 코드로 참조 할 수있는 JSP를 세트로 PingFederate의 OAuth 놀이터 배송. 이 사이트 (및 기타 오픈 소스 라이브러리 및 샘플)는 다음 위치에서 다운로드 할 수 있습니다. developer.pingidentity.com/en/code.html
Scott T.

Scott, 로컬 리소스 서버 및 PingFederate로 인증 된 Rest API를 사용하여 클라이언트 자격 증명 부여를 인증 서버로 보여주는 샘플을 찾고 있습니다. 로컬 자원 서버는 유효성 검증 엔드 포인트를 호출합니다. 그런 걸 봤어?
JavaHead

@JavaHead 다시 PingFederate OAuth Playground를 참조 할 수 있어야합니다. 또한 클라이언트 자격 증명 부여 유형과 리소스 서버의 액세스 토큰 유효성 검사를 모두 보여줍니다.
Scott T.

JWT 액세스 토큰의 경우, 일반적으로 RS에 대한 모든 수신 요청에 대해 AS 내부 검사 엔드 포인트에 도달하지 않으려는 것으로 가정합니다. 어떤 경우, 토큰 서명 및 범위에 대한 RS 점검이 충분합니까? 아니면 RS가 일정 시간 동안 AS의 내부 검사 응답을 캐시 할 수 있습니까?
Gary

119

구글 웨이

Google Oauth2 토큰 유효성 검사

의뢰:

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=1/fFBGRNJru1FQd44AzqT3Zg

응창 성가:

{
  "audience":"8819981768.apps.googleusercontent.com",
  "user_id":"123456789",
  "scope":"https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email",
  "expires_in":436
} 

Microsoft 방식

Microsoft-Oauth2 인증 확인

Github 방식

Github-Oauth2 인증 확인

의뢰:

GET /applications/:client_id/tokens/:access_token

응창 성가:

{
  "id": 1,
  "url": "https://api.github.com/authorizations/1",
  "scopes": [
    "public_repo"
  ],
  "token": "abc123",
  "app": {
    "url": "http://my-github-app.com",
    "name": "my github app",
    "client_id": "abcde12345fghij67890"
  },
  "note": "optional note",
  "note_url": "http://optional/note/url",
  "updated_at": "2011-09-06T20:39:23Z",
  "created_at": "2011-09-06T17:26:27Z",
  "user": {
    "login": "octocat",
    "id": 1,
    "avatar_url": "https://github.com/images/error/octocat_happy.gif",
    "gravatar_id": "somehexcode",
    "url": "https://api.github.com/users/octocat"
  }
}

아마존 방식

Amazon으로 로그인-개발자 안내서 (2015 년 12 월, 21 페이지)

요청 :

https://api.amazon.com/auth/O2/tokeninfo?access_token=Atza|IQEBLjAsAhRmHjNgHpi0U-Dme37rR6CuUpSR...

응답 :

HTTP/l.l 200 OK
Date: Fri, 3l May 20l3 23:22:l0 GMT 
x-amzn-RequestId: eb5be423-ca48-lle2-84ad-5775f45l4b09 
Content-Type: application/json 
Content-Length: 247 

{ 
  "iss":"https://www.amazon.com", 
  "user_id": "amznl.account.K2LI23KL2LK2", 
  "aud": "amznl.oa2-client.ASFWDFBRN", 
  "app_id": "amznl.application.436457DFHDH", 
  "exp": 3597, 
  "iat": l3ll280970
}

2
@gustavodiazjaimes 서버 측이 토큰에서 할당 된 사용자 ID를 인식하는 방법을 전혀 설명하지 않습니다.
user2284570

22
나는 모든 투표를 이해하지 못한다. 이것은 질문에 대답하지 않는 것 같습니다.
던컨 존스

Azure Active Directory에 발급 된 토큰이 유효한지 확인하는 비슷한 끝 점이 있는지 아는 사람이 있습니까?
user180940

2
즉, 자신의 롤.
AndroidDev

51

@Scott T.의 답변에 대한 업데이트 : 토큰 유효성 검사를위한 Resource Server와 Authorization Server 간의 인터페이스는 2015 년 10 월 IETF RFC 7662에서 표준화되었습니다 ( https://tools.ietf.org/html/rfc7662 참조) . 샘플 유효성 검사 호출은 다음과 같습니다.

POST /introspect HTTP/1.1
Host: server.example.com
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer 23410913-abewfq.123483

token=2YotnFZFEjr1zCsicMWpAA

샘플 응답 :

HTTP/1.1 200 OK
Content-Type: application/json

{
  "active": true,
  "client_id": "l238j323ds-23ij4",
  "username": "jdoe",
  "scope": "read write dolphin",
  "sub": "Z5O3upPC88QrAjx00dis",
  "aud": "https://protected.example.net/resource",
  "iss": "https://server.example.com/",
  "exp": 1419356238,
  "iat": 1419350238,
  "extension_field": "twenty-seven"
}

물론 공급 업체와 제품의 채택은 시간이 지남에 따라 이루어져야합니다.


OoenId Connect를 사용하면 액세스 토큰의 유효성을 검사하기 위해 id 토큰을 사용하는 openid 방식을 선호하지 않습니다 : openid.net/specs/…
adnan kamili

1
@Renan : 권한 부여 요청에서 스코프가 요청되는 방식과 일치합니다. 여기 scope에는 값으로 공백으로 구분 된 스코프 목록이 포함 된 쿼리 매개 변수가 있습니다
.

4
치리회가 공식적으로 승인하지 않은 단어는 "표준화"라는 단어를 사용하지 마십시오. 2018 년 2 월 현재 IETF RFC 7662는 그것이 "제안"임을 분명히 나타냅니다.
AndroidDev

1
@adnankamili "제안"과 같은 것은 없습니다. 문서가 RFC가 될 때까지는 이미 "제안 된 표준"으로 문서 뒤에 상당한 가중치를 부여합니다. OAuth 2.0 자체는 여전히 "제안 된 표준"이므로 어떤 점을 만들려고했는지 확실하지 않습니다.
Pace

15

OAuth 2.0 사양은 부품을 정의하지 않습니다. 그러나 몇 가지 옵션이있을 수 있습니다.

  1. 리소스 서버가 Authz 헤더에서 토큰을 가져 오면 Authz 서버에서 validate / introspect API를 호출하여 토큰의 유효성을 검사합니다. 여기서 Authz 서버는 DB 스토어를 사용하거나 서명 및 특정 속성을 확인하여 서버를 검증 할 수 있습니다. 응답의 일부로 토큰을 해독하고 남은 만료 시간과 함께 토큰의 실제 데이터를 보냅니다.

  2. Authz 서버는 개인 키를 사용하여 토큰을 암호화 / 서명 한 다음 공개 키 / 인증서를 Resource Server에 제공 할 수 있습니다. 리소스 서버가 토큰을 받으면 서명을 해독 / 확인하여 토큰을 확인합니다. 내용을 꺼내고 토큰을 처리합니다. 그런 다음 액세스를 제공하거나 거부 할 수 있습니다.


8

OAuth v2 사양은 다음을 나타냅니다.

보호 자원에 액세스하는 데 사용되는 액세스 토큰 속성 및 방법은이 사양의 범위를 벗어나며 동반 사양에 의해 정의됩니다.

내 Authorization Server에는 자원 서버가 access_token이 유효한지 알 수있는 웹 서비스 (SOAP) 엔드 포인트가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.