Как проверить токен доступа OAuth 2.0 для сервера ресурсов?

Когда клиент запрашивает сервер ресурсов для получения защищенного ресурса с помощью токена доступа OAuth 2.0, как этот сервер проверяет токен? Протокол токена обновления OAuth 2.0?

Ответ 1

Обновление от ноября 2015 года: Согласно Hans Z. ниже - теперь это действительно определено как часть RFC 7662.

Оригинальный ответ: Спецификация OAuth 2.0 (RFC 6749) не дает четкого определения взаимодействия между сервером ресурсов (RS) и сервером авторизации (AS) для проверки токена доступа (AT). Это действительно зависит от формата/стратегии токена AS - некоторые токены являются автономными (например, JSON Web Tokens), в то время как другие могут быть похожи на куки файл сеанса, поскольку они просто ссылаются на информацию, хранящуюся на стороне сервера на AS.

В рабочей группе OAuth проводилось обсуждение создания стандартного способа связи RS с AS для проверки AT. Моя компания (Ping Identity) предложила один из таких подходов для нашей коммерческой OAuth AS (PingFederate): https://support.pingidentity.com/s/document-item?bundleId=pingfederate-93&topicId=lzn1564003025072.html#lzn1564003025072__section_N10578_N1002A_N10001. Для этого используется взаимодействие на основе REST, которое очень дополняет OAuth 2.0.

Ответ 2

Путь Google

Проверка токенов 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 путь

Войти через Amazon - Руководство разработчика (декабрь 2015 г., стр. 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
}

Ответ 3

Обновление для ответа @Scott T.: интерфейс между сервером ресурсов и сервером авторизации для проверки маркера был стандартизован в IETF RFC 7662 в октябре 2015 г., см. 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"
}

Конечно, принятие поставщиками и продуктами должно произойти со временем.

Ответ 4

Спецификация OAuth 2.0 не определяет деталь. Но может быть несколько вариантов:

  • Когда сервер ресурсов получает токен в заголовке Authz, он вызывает API проверки подлинности /introspect на сервере Authz для проверки токена. Здесь сервер Authz может проверить его либо из хранилища БД, либо для проверки подписи и определенных атрибутов. В качестве части ответа он декодирует токен и отправляет фактические данные маркера вместе с оставшимся временем истечения срока.

  • Authz Server может объявлять/подписывать токен с помощью закрытого ключа, а затем публиковать /cert может быть предоставлен серверу ресурсов. Когда сервер ресурсов получает токен, он либо расшифровывает/проверяет подпись, чтобы проверить токен. Вынимает содержимое и обрабатывает токен. Затем он может либо предоставить доступ, либо отклонить.

Ответ 5

Спецификации OAuth v2 указывают:

Атрибуты токена доступа и методы, используемые для доступа к защищенным ресурсам, выходят за рамки данной спецификации и определяются спецификациями компаньона.

Мой сервер авторизации имеет конечную точку webservice (SOAP), которая позволяет серверу ресурсов знать, действителен ли параметр access_token.