Как работает двусторонняя аутентификация в OAuth 2.0?

В OAuth 1.0 2-legged довольно легко: просто отправьте запрос как обычно и опустите заголовок access_token.

Кажется, что-то изменилось в OAuth 2.0 (резко, как я узнал сегодня :)). В OAuth 2.0 запрос больше не имеет заголовков, таких как одноразовый номер, ключ потребителя, метка времени и т. д. Он просто заменен на:

Authorization: OAuth ya29.4fgasdfafasdfdsaf3waffghfhfgh

Я понимаю, как работает трехэтапная авторизация в OAuth 2.0 и потоки приложений. Но как работает двуногий в 2.0? Можно ли разработать API, поддерживающий как двухсторонний, так и трехсторонний OAuth 2.0?

Я искал информацию об этом, но я нашел много информации о двуногих для 1.0 и почти ничего для 2.0.


person F21    schedule 10.01.2013    source источник
comment
согласен с вами, информации по 3-legged oauth2.0 или 2-legged oauth 1.0 достаточно, а по 2-legged oauth 2.0 почти ничего.   -  person skyfree    schedule 14.05.2013


Ответы (2)


После долгих исследований я обнаружил, что тип гранта client_credentials подходит для этого сценария. Как только вы введете этот термин в Google, вы сможете найти множество очень полезных ресурсов.

Это нормальный процесс для трехэтапного OAuth 2.0 (мы хотим, чтобы пользователь выполнил вход):

Предположим, у нас есть следующие конечные точки в нашем приложении для аутентификации:

/oauth/auth

/oauth/token

Обычно (для предоставления кода авторизации) мы направляем пользователя на /oauth/auth?state=blah&client_id=myid&redirecturl=mysite.com/blah

Затем при аутентификации пользователь перенаправляется на mysite.com/blah?code=somecode

Затем мы получаем somecode и обмениваем его на токен, используя /oauth/token?code=somecode&client_id=myid&client_secret=mysecret

Затем мы можем использовать токен для совершения звонков.


Это поток приложения для client_credentials для реализации двухстороннего OAuth 2.0, который заметно проще:

  • В этом подходе нам не нужно выполнять какую-либо аутентификацию.
  • Мы просто POST в /oauth/token со следующими данными формы:

    grant_type=client_credentials&scope=view_friends
    

Обратите внимание, что область не является обязательной. Затем конечная точка напрямую возвращает нам маркер доступа (маркер обновления не предоставляется). Поскольку токен обновления не предоставляется, по истечении срока действия токена вам потребуется повторно пройти аутентификацию и запросить новый.

Это приводит к следующим предостережениям:

  • Используйте это только для (очень-очень) доверенных приложений, таких как внутренние приложения.
  • Вам нужно разработать свой собственный способ аутентификации. Например, в примере RFC используется базовая авт.

Другим решением является использование JWT (веб-токенов JSON), таких как Google OAuth API. Это очень сложный процесс, но существует множество библиотек для создания вашего JWT. Затем вы публикуете следующие данные формы (конечно, в кодировке URL):

grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=generated_jwt

Это отправлено на /oauth/token, чтобы получить ваш токен.


Что касается вопроса о том, можно ли создать API, поддерживающий двухсторонний и трехсторонний OAuth 2.0, да, это возможно.

Затем конечная точка /auth используется только тогда, когда пользователям необходимо пройти аутентификацию в службе.

В конечной точке /token просто проверьте значение grant_type в параметрах GET для urn:ietf:params:oauth:grant-type:jwt-bearer при использовании JWT или client_credentials для client_credentials.

Обратите внимание, что при создании client_id и client_secret для предоставления пользователю, если вы поддерживаете несколько grant_types, убедитесь, что у вас есть столбец базы данных для хранения того, для какого типа гранта были сгенерированы идентификатор и секрет. Если требуется иметь несколько типов грантов для каждого пользователя, создайте разные наборы учетных данных для каждого типа грантов.

person F21    schedule 10.01.2013
comment
Если вы хотите, вы также можете проверить реализацию Google. Например, опыт разработчиков задокументирован здесь: developers.google.com/drive/delegation И да. в основном используя учетные данные клиента и специальные «служебные учетные записи», которым вы делегируете широкий доступ к домену. - person Nicolas Garnier; 11.01.2013
comment
Здравствуйте, Nivco! Я работаю над проектом, связанным с Google API, и не нашел достаточно информации/знаний о двустороннем протоколе oauth 2.0. Ваша ссылка выше действительно помогает, однако мой вопрос: как насчет API календаря Google, API контактов Google и Gmail IMAP XOAUTH? Поддерживают ли они двухсторонний oauth2? Благодарность - person skyfree; 14.05.2013
comment
Для получения дополнительной информации о двусторонней реализации OAuth2 от Google вы также можете перейти по следующей ссылке:developers.google. .com/accounts/docs/OAuth2ServiceAccount. Кроме того, токены доступа, полученные через двусторонний OAuth2 Google, поддерживаются всеми API Google (включая календарь, контакты и т. д.). -google-apis-support-oauth2-domain-wide-delegation/20135458#20135458" title="какие API Google поддерживают широкое делегирование домена oauth2">stackoverflow.com/questions/20127114/. Надеюсь, это поможет. - person Miguel Andres; 22.11.2013

Вы также можете проверить реализацию Google 2-legged OAuth2 (я полагаю, что эта документация была опубликовано совсем недавно).

документы по делегированию SDK Google Диска также должны помочь понять двустороннюю реализацию Google OAuth2.

person Miguel Andres    schedule 22.11.2013