Авторизация для мобильных сайтов

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

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

Обзор процесса авторизации мобильного сайта

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

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

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

Обменяйте авторизационный код с вашего сервера на идентификатор сессии и используйте его для доступа к API.

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

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

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

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

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

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

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

Результат авторизации выозвращается в виде 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 текущего пользователя, а не просто возьмете тот, по которому он только что пришел.

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