리소스 서버에 대한 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.