Лекция 13 мин.
Привет, Вы узнаете о том , что такое oauth, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое oauth , настоятельно рекомендую прочитать все из категории Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend) .
OAuth 1.0 — это протокол авторизации, который позволяет приложению получить ограниченный доступ к ресурсам пользователя на другом сервисе без передачи логина и пароля.
Он использовался, например, в ранних API Twitter и LinkedIn.
Главная идея OAuth1
Приложение получает токен доступа вместо логина и пароля пользователя.
Ниже — последовательность работы OAuth 1.0.
Разработчик регистрирует приложение у провайдера.
Приложение получает:
Это аналог client_id / client_secret.
Приложение отправляет запрос провайдеру:
POST /oauth/request_token
Передаются:
Ответ:
oauth_token=REQUEST_TOKEN oauth_token_secret=REQUEST_SECRET
Этот токен еще не авторизован пользователем.
Пользователь отправляется на страницу авторизации провайдера.
https://provider.com/oauth/authorize?oauth_token=REQUEST_TOKEN
Пользователь:
После подтверждения провайдер делает redirect:
callback_url?oauth_token=REQUEST_TOKEN&oauth_verifier=VERIFIER
Приложение получает:
Приложение отправляет запрос:
POST /oauth/access_token
Передаются:
Ответ:
oauth_token=ACCESS_TOKEN oauth_token_secret=ACCESS_SECRET
Теперь приложение может обращаться к API:
GET /user/profile Authorization: OAuth ...
Каждый запрос подписывается:
Подпись обычно:
HMAC-SHA1

Каждый HTTP-запрос подписывается:
Это делает запросы криптографически защищенными.
Пользователь вводит пароль только на стороне провайдера.
OAuth1:
Поэтому появился OAuth 2.0.
Как и первая версия, OAuth 2.0 основан на использовании базовых веб-технологий: HTTP-запросах, редиректах и т. п. Поэтому использование OAuth возможно на любой платформе с доступом к интернету и браузеру: на сайтах, в мобильных и desktop-приложениях, плагинах для браузеров…
Ключевое отличие от OAuth 1.0 — простота. В новой версии нет громоздких схем подписи, сокращено количество запросов, необходимых для авторизации.
Общая схема работы приложения, использующего OAuth, такова:
Результатом авторизации является access token — некий ключ (обычно просто набор символов), предъявление которого является пропуском к защищенным ресурсам. Обращение к ним в самом простом случае происходит по HTTPS с указанием в заголовках или в качестве одного из параметров полученного access token'а.
В протоколе описано несколько вариантов авторизации, подходящих для различных ситуаций:

Это самый сложный вариант авторизации, но только он позволяет сервису однозначно установить приложение, обращающееся за авторизацией (это происходит при коммуникации между серверами на последнем шаге). Во всех остальных вариантах авторизация происходит полностью на клиенте и по понятным причинам возможна маскировка одного приложения под другое. Об этом говорит сайт https://intellect.icu . Это стоит учитывать при внедрении OAuth-аутентификации в API сервисов.
Здесь и далее примеры приводятся для API intellect.icu, но логика одинаковая для всех сервисов, меняются только адреса страниц авторизации. Обратите внимание, что запросы надо делать по HTTPS.
Редиректим браузер пользователя на страницу авторизации:
> GET /oauth/authorize?response_type=code&client_id=1111&
redirect_uri=http%3A%2F%2Fintellect.icu%2Fcb%2F123 HTTP/1.1
> Host: connect.intellect.icu
Здесь и далее, client_id и client_secret — значения, полученные при регистрации приложения на платформе.
После того, как пользователь выдаст права, происходит редирект на указанный redirect_uri:
< HTTP/1.1 302 Found < Location: http://example.com/cb/123?code=gfjfgjgfjb0y
Обратите внимание, если вы реализуете логин на сайте с помощью OAuth, то рекомендуется в redirect_uri добавлять уникальный для каждого пользователя идентификатор для предотвращения CSRF-атак (в примере это 123). При получении кода надо проверить, что этот идентификатор не изменился и соответствует текущему пользователю.
Используем полученный code для получения access_token, выполняя запрос с сервера:
> POST /oauth/token HTTP/1.1
> Host: connect.intellect.icu
> Content-Type: application/x-www-form-urlencoded
>
> grant_type=authorization_code&client_id=49&client_secret=dgfhfgef&code=gfjfgjgfjb0y&
redirect_uri=http%3A%2F%2Fexample.com%2Fcb%2F123
< HTTP/1.1 200 OK
< Content-Type: application/json
<
< {
< "access_token":"tfrtgu",
< "token_type":"bearer",
< "expires_in":86400,
< "refresh_token":"thdtthTDHtrht",
< }
Обратите внимание, что в последнем запросе используется client_secret, который в данном случае хранится на сервере приложения, и подтверждает, что запрос не подделан.
В результате последнего запроса получаем сам ключ доступа (access_token), время его «протухания» (expires_in), тип ключа, определяющий как его надо использовать, (token_type) и refresh_token о котором будет подробнее сказано ниже. Дальше, полученные данные можно использовать для доступа к защищенным ресурсам, например, API intellect.icu:
> GET /platform/api?oauth_token=tbhuiGDSGGGg76rf&client_id=5119&format=json&method=users.getInfo&
sig=... HTTP/1.1
> Host: apps.intellect.icu
Описание в спецификации

Этот вариант требует поднятия в приложении окна браузера, но не требует серверной части и дополнительного вызова сервер-сервер для обмена authorization code на access token.
Открываем браузер со страницей авторизации:
> GET /oauth/authorize?response_type=token&client_id=454119 HTTP/1.1 > Host: connect.intellect.icu
После того, как пользователь выдаст права, происходит редирект на стандартную страницу-заглушку, для intellect.icu это connect.intellect.icu/oauth/success.html:
< HTTP/1.1 302 Found
< Location: http://connect.intellect.icu/oauth/success.html#access_token=jhgbujgjyhg&token_type=bearer&
expires_in=16400&refresh_token=thdtthTDHtrht
Приложение должно перехватить последний редирект, получить из адреса acess_token и использовать его для обращения к защищенным ресурсам.
Авторизация по логину и паролю представляет простой POST-запрос, в результате которого возвращается access token. Такая схема не представляет из себя ничего нового, но вставлена в стандарт для общности и рекомендуется к применению только, когда другие варианты авторизации не доступны.
> POST /oauth/token HTTP/1.1
> Host: connect.intellect.icu
> Content-Type: application/x-www-form-urlencoded
>
> grant_type=password&client_id=31337&client_secret=deadbeef&username=api@corp.intellect.icu&
password=qwerty
< HTTP/1.1 200 OK
< Content-Type: application/json
<
< {
< "access_token":"hgfvyfyujfygjftyf32",
< "token_type":"bearer",
< "expires_in":96400,
< "refresh_token":"thdtthTDHtrht",
< }
Обычно, access token имеет ограниченный срок годности. Это может быть полезно, например, если он передается по открытым каналам. Чтобы не заставлять пользователя проходить авторизацию после истечения срока действия access token'а, во всех перечисленных выше вариантах, в дополнение к access token'у может возвращаться еще refresh token. По нему можно получить access token с помощью HTTP-запроса, аналогично авторизации по логину и паролю.
> POST /oauth/token HTTP/1.1
> Host: connect.intellect.icu
> Content-Type: application/x-www-form-urlencoded
>
> grant_type=refresh_token&client_id=31337&client_secret=dfhdfhdfhdfh&refresh_token=thdtthTDHtrht
< HTTP/1.1 200 OK
< Content-Type: application/json
<
< {
< "access_token":"JRTr5677",
< "token_type":"bearer",
< "expires_in":86400,
< "refresh_token":"thdtthTDHtrht",
< }
OAuth 2.0 — это протокол делегированной авторизации, который позволяет одному приложению получать доступ к ресурсам пользователя без передачи пароля.
Главная идея:
пользователь разрешает приложению доступ через доверенный сервер авторизации.
Пример:
Вы входите в сайт через Google / GitHub / Facebook — сайт не получает ваш пароль, а получает access token.
Основные цели протокола:
В процессе участвуют 4 роли:
| Роль | Описание |
|---|---|
| Resource Owner | пользователь |
| Client | приложение (сайт / мобильное приложение) |
| Authorization Server | сервер авторизации |
| Resource Server | API с защищенными данными |
1 Полная схема OAuth2 Authorization Code
2 OAuth2 + PKCE (как в SPA)
3 OAuth2 + JWT токены


Это самый распространенный и безопасный flow.
Клиент отправляет пользователя на Authorization Server.
GET /authorize client_id=123 redirect_uri=https://client.app/callback response_type=code scope=profile email
На сервере авторизации пользователь:
После подтверждения пользователь перенаправляется обратно:
https://client.app/callback?code=AUTH_CODE
Клиент отправляет запрос на сервер авторизации:
POST /token grant_type=authorization_code code=AUTH_CODE client_id=123 client_secret=abc
Ответ:
{
"access_token": "TOKEN",
"refresh_token": "REFRESH",
"expires_in": 3600
}
Теперь приложение может обращаться к Resource Server:
GET /user/profile Authorization: Bearer ACCESS_TOKEN
Access Token — это ключ доступа к API.
Обычно:
Он имеет:
Если Access Token истек, используется Refresh Token:
POST /token grant_type=refresh_token refresh_token=XXXX
| Тип | Назначение |
|---|---|
| Authorization Code | веб-приложения |
| PKCE | SPA и мобильные приложения |
| Client Credentials | сервер-сервер |
| Device Code |
устройства без браузера |
Коротко:
OAuth2 — это протокол делегированной авторизации, который позволяет приложению получать доступ к данным пользователя через access token, не раскрывая пароль.
| OAuth 1.0 | OAuth 2.0 | |
|---|---|---|
| Подпись | HMAC-SHA1 | обычно нет |
| Токены | request + access | access + refresh |
| Сложность | высокая | проще |
| Безопасность | криптоподписи | HTTPS |
| сложная криптография | проще | |
| подписи запросов | access token | |
| сложная реализация | проще внедрить |
Исследование, описанное в статье про oauth, подчеркивает ее значимость в современном мире. Надеюсь, что теперь ты понял что такое oauth и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)
Комментарии