Авторизация для сайтов

Вы можете подключить авторизацию от Mail.Ru к любому сайту. Вы можете использовать полученный идентификатор сессии для регистрации или логина пользователя на вашем сайте, а также для доступа к REST API Mail.Ru.

Если вы разрабатываете социальное приложение для Моего Мира, то вам не нужна авторизация с OAuth, так как все параметры, в том числе идентификатор сессии, приходят в приложение при инициализации. Подробности см. в руководстве по разработке социальных приложений.

Обзор процесса авторизации сайта

Авторизация реализована по протоколу OAuth 2.0. Подробнее о деталях реализации OAuth в Mail.Ru и использовании его для доступа к API читайте в руководстве по авторизации.

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

Когда пользователь авторизует ваш сайт, его браузер будет отправлен на заданный вами адрес. Используйте параметры в URL страницы чтобы получить идентификатор сессии.

Детальное описание процесса авторизации

Для начала, зарегистрируйте ваш сайт. При регистрации вам будет выдан идентификатор, приватный и секретный ключи.

В нужный момент, сделайте редирект на страницу авторизации. Например, вы можете сделать кнопку «Войти с Mail.Ru» на страницах регистрации или логина, по нажатию на которую будет происходить перенаправление. Адрес страницы авторизации:

https://connect.mail.ru/oauth/authorize?
   client_id=идентификатор вашего сайта&
   response_type=token&
   redirect_uri=адрес принимающей страницы на вашем сайте

В значении параметра redirect_uri передайте адрес страницы, на которую будет происходить перенаправление пользователя после авторизации. Эта страница должна находиться на домене вашего сайта.

В качестве значений параметра response_type вы можете указать одно любое значение из списка (какое значение следует выбрать зависит от того, что вы будете делать с полученными параметрами):

Используйте необязательный параметр scope чтобы запросить у пользователя требующиеся вашему сайту привилегии. Если требуется запросить несколько привилегий, они передаются в scope через пробел.

После авторизации пользователь будет перенаправлен на страницу, указанную вами в redirect_uri, например, http://example.com/oauth/receiver.

Если вы указали response_type=token

После авторизации браузер будет перенаправлен на адрес следующего вида:

http://example.com/oauth/receiver#
   refresh_token=b45529ac9bf6b32be761975c043ef9e3&
   access_token=b6442ed12223a7d0b459916b8ea03ce5&
   token_type=bearer

На вашей принимающей странице должен быть ваш JavaScript, который при открыти страницы разберет содержимое якоря (части после символа #): оно представлено в формате application/x-www-form-urlencoded.

Значение access_token — это идентификатор сессии, необходимый для работы с REST API.

В параметре refresh_token содержится ключ, который вы можете использовать для восстановления сессии при последующих заходах пользователя в ваше приложение. Подробности см. в руководстве по авторизации с помощью логина и пароля.

Если вы указали response_type=code_and_token

Этот вариант аналогичен предыдущему, за исключением того, что к возвращаемым параметрам добавляется code, например, так:

http://example.com/oauth/receiver#
   refresh_token=b45529ac9bf6b32be761975c043ef9e3&
   access_token=b6442ed12223a7d0b459916b8ea03ce5&
   token_type=bearer&
   code=cfb65617ee147446cb17fba30b2fdc5e

Обработайте параметры аналогично варианту с response_type=token и отправьте значение code на сервер для получения отдельной сессии для использования REST API с сервера вашего сайта (подробности см. ниже).

Если вы указали response_type=code

В этом случае результат авторизации выозвращается в виде GET-параметров, чтобы вы сразу имели к ним доступ с сервера, например, так:

http://example.com/oauth/receiver?
   code=cfb65617ee147446cb17fba30b2fdc5e

Обменяйте полученный авторизационный код на идентификатор сессии, который вы сможете использовать для доступа к REST API. Для этого с сервера сделайте следующий POST-вызов на адрес https://connect.mail.ru/oauth/token:

> POST /oauth/token HTTP/1.1
> Host: connect.mail.ru
> Accept: */*
> Content-Length: 186
> Content-Type: application/x-www-form-urlencoded
> 
> client_id=464119&
  client_secret=ac7fd2cc742c70a707cad3f6b2ca1c89&
  grant_type=authorization_code&
  code=000ff8627d2d79b60ebdaf004f9a68aa&
  redirect_uri=http://example.com/oauth/receiver

В теле POST-запроса должны находиться данные в формате application/x-www-form-urlencoded (все указанные параметры обязательны):

В ответ на этот запрос вы получите примерно такой результат:

{
  "refresh_token":"a45529ac9bf6b32be761975c043ef9e3",
  "expires_in":86400,
  "access_token":"56a59ff5d5cf9645b872750454d8a27b",
  "x_mailru_vid":"1324730981306483817"
}

Значение access_token — это идентификатор сессии, необходимый для работы с REST API.

В параметре refresh_token содержится ключ, который вы можете использовать для восстановления сессии при последующих заходах пользователя в ваше приложение. Подробности см. в руководстве по авторизации с помощью логина и пароля.

Дополнительно

В случае возникновения ошибок в процессе авторизации, браузер также будет перенаправлен на указанный redirect_uri, с указанием причины ошибки в параметре error. См. подробности в разделе Error Response спецификации OAuth.

См. также разделы Authorization Request и Authorization Response спецификации OAuth.

Важное замечание по безопасности

Если вы привязываете авторизацию на Mail.Ru к авторизации на вашем сайте, используйте для каждого пользователя уникальный redirect_uri. Иначе становится возможной следующая атака:

  1. Злоумышленник начинает авторизацию с вашего сайта, используя response_type=code.
  2. После авторизации злоумышленник получает свой авторизационный код, но не переходит на вашу принимающую страницу.
  3. Злоумышленник каким-либо способом заставляет обычного пользователя перейти на вашу принимающую страницу со своим авторизационным кодом (например, посылает ему ссылку через Mail.Ru Агент).
  4. Вы меняете полученный авторизационный код на сессию и привязываете жертву к аккаунту злоумышленника на Mail.Ru. Если вы разрешаете логин на вашем сайте с помощью авторизации от Mail.Ru, то это будет означать, что злоумышленник сможет войти на ваш сайт под видом жертвы.

Использование уникальных redirect_uri для каждого пользователя предотвращает такую атаку, так как при обмене авторизационного кода на сессию требуется указать redirect_uri с которым был получен авторизационный код, а они для злоумышленника и жертвы будут разные. Естественно, это сработает если при обмене авторизационного кода вы вычислите redirect_uri текущего пользователя, а не просто возьмете тот, по которому он только что пришел.

Дополнительно