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

147

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

Ack
источник
Предполагается, что сервер сможет проверять токен, который он сам ранее выпустил ... Обычно это будет поиск в базе данных или крипто (самозаверяющие токены).
Тило
Понимаю. Как насчет этого случая, владелец ресурса WS и клиент WS находятся на разных устройствах?
Ack
5
Вы имеете в виду службу аутентификации и службу ресурсов? (клиент / потребитель всегда будет на другом устройстве и сам не сможет проверить токены). В этом случае вы можете использовать токены обновления, которые «дороги» для проверки (это может сделать только сервер авторизации), но долгоживущие и токены доступа, которые часто истекают и могут быть проверены в автономном режиме.
Тило
blog.facilelogin.com/2016/03/…
Prabath Siriwardena

Ответы:

97

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

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

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

Скотт Т.
источник
Скотт Т. Есть ли способ увидеть пример кода о том, как использовать эту функцию в Ping Federate?
JavaHead
2
@JavaHead На нашем веб-сайте для разработчиков есть еще несколько деталей протокола: developer.pingidentity.com/en/resources/…PingFederate OAuth Playground поставляется в виде набора JSP, на который можно ссылаться как на исходный код для проверки токенов. Его (и другие библиотеки и примеры с открытым исходным кодом) можно скачать здесь: developer.pingidentity.com/en/code.html
Скотт Т.
Скотт, я ищу образец, который продемонстрировал бы Предоставление клиентских учетных данных с Rest API, защищенным локальным сервером ресурсов и PingFederate в качестве сервера проверки подлинности. Затем локальный сервер ресурсов вызовет конечную точку проверки. Вы сталкивались с чем-нибудь подобным?
JavaHead
@JavaHead еще раз, это то, на что вы должны ссылаться на игровую площадку PingFederate OAuth. Он демонстрирует как тип предоставления клиентских учетных данных, так и проверку токена доступа сервером ресурсов.
Скотт Т.
В случае маркера доступа JWT я бы предположил, что вы обычно не захотите обращаться к конечной точке самоанализа AS для каждого входящего запроса к RS. В каком случае достаточно ли проверки RS подписи токена и области действия? Или, возможно, RS мог бы кэшировать ответы самоанализа от AS в течение некоторого времени?
Гэри
119

Путь 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 - Руководство разработчика (декабрь 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
}
gustavodiazjaimes
источник
2
@gustavodiazjaimes Это вообще не объясняет, как серверная сторона распознает назначенный идентификатор пользователя из токена.
user2284570
22
Я не понимаю всех голосов. Это не похоже на ответ на вопрос.
Дункан Джонс
Кто-нибудь знает, имеет ли Azure Active Directory аналогичную конечную точку для проверки допустимости выданного токена?
user180940
2
Другими словами, катите свои собственные.
AndroidDev
51

Обновленная информация об ответе @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"
}

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

Ханс З.
источник
Если вы используете OoenId Connect, мы не должны использовать openid способ использования токена id для проверки токена доступа: openid.net/specs/…
adnan kamili
1
@Renan: чтобы соответствовать тому, как запрашиваются области в запросе авторизации, то есть с scopeпараметром запроса, значение которого содержит разделенный пробелами список областей
Hans Z.
4
Пожалуйста, не используйте слово «стандартизированный», если что-то не было официально принято руководящим органом. IETF RFC 7662 по состоянию на февраль 2018 года четко указывает, что это «предложение».
AndroidDev
1
@adnankamili Нет такой вещи как «предложение». К тому времени, когда документ становится RFC, он уже является «предлагаемым стандартом», который имеет значительный вес. Сам по себе OAuth 2.0 все еще является «предлагаемым стандартом», поэтому я не уверен, что вы пытаетесь сделать.
Pace
15

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

  1. Когда сервер ресурсов получает токен в заголовке Authz, он вызывает API-интерфейс validate / introspect на сервере Authz для проверки токена. Здесь сервер Authz может проверить его либо с помощью DB Store, либо путем проверки подписи и определенных атрибутов. Как часть ответа, он декодирует токен и отправляет фактические данные токена вместе с оставшимся временем истечения.

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

dvsakgec
источник
8

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

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

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

Карлос АГ
источник