Контент


Список OAuth-провайдеров и их параметры

Решил вот набросать список OAuth-провайдеров, с которыми имел дело при работе с модулями OAuth и SSO. Естественно, с линками на документацию, основными endpoints и небольшими примечаниями. Надеюсь, эти данные будут полезны. Кроме авторизации, я добавил немного информации по следующему логичному шагу — получению профиля пользователя через API провайдера.

Не забывайте, что OAuth не затрагивает обращения к API для получения пользовательских данных на основе токенов. Это отдельная тема, хоть и связанная с авторизацией в большинстве случаев.

OAuth v1

Краткое описание механизма

Спецификация тут. В целом схему я описывал ранее. На всякий случай напомню основные задействованные параметры:

  • client_key и client_secret — параметры, полученный от провайдера при регистрации приложения.
  • redirect_uri — УРЛ, сообщающий провайдеру, куда отправить пользователя после подтверждения аккаунта.
  • verifier — код подтверждения, передается провайдером при обратном редиректе на redirect_uri. Он активирует полученный ранее Request Token.
  • scope — опциональный (в большинстве случаев) параметр, определяющий «границы дозволенного» для приложения.
  • url_request_token — endpoint для получения Request Token
  • url_authorize — endpoint для активации Request Token. Запрос к нему возвращает verifier.
  • url_access_token — endpoint для обмена Request Token на Access Token

Access Token и Request Token каждый представляет собой комбинацию из двух значений (token и secret). Публичный ключ (token) передается явно в запросе, а секретный (secret) используется для подписывания (signing) запросов. Request Token нужен для получения Access Token, а тот уже может использоваться для работы с API провайдера.

Провайдеры

Google

Google обозначил свое OAuth 1.0 API как deprecated, поэтому его вы увидите в разделе OAuth v2.

Twitter

Все достаточно стандартно.

Обратите внимание, с 14.01.2014 все обращения к Twitter API работают только через HTTPS.

Yahoo

Для получения информации о пользователе нужен его ID. Идентификатор текущего пользователя возвращается вместе с Access Token (параметр xoauth_yahoo_guid). Модуль OAuth сохранит его в объекте OAuth_Token_Access

LinkedIn

Все еще поддерживает OAuth v1.0a, но рекомендует использовать v2.0. Поэтому в данном разделе его не будет, смотрите ниже.

Flickr

Tumblr

Что интересно, Tumblr не возвращает user_id, только имя пользователя (ну и всякую прочую специфичную информацию типа списка блогов).

OAuth v2

Ссылка на стандарт (черновик!), моя статья про OAuth v2.

Краткое описание механизма

1. При регистрации приложения получаем client_id и client_secret. В настройках приложения указываем redirect_uri — это УРЛ, на который провайдер будет редиректить после получения (или неполучения) от пользователя разрешения на использование аккаунта.
2. Запрашиваем у провайдера Request Token. Необходимо совершить GET-запрос к адресу url_authorize, передав в него параметры client_id и redirect_uri. Модуль Kohana OAuth автоматически добавляет response_type=code, так что Request Token добавляется в Query String к redirect_uri в виде параметра code. На этом этапе происходит уход с нашего сайта на сайт провайдера. Собственно для возвращения обратно и нужен redirect_uri.
3. Обмениваем Request Token на Access Token. Для этого выполняем POST-запрос к адресу url_access_token. В качестве параметров — полученный на предыдущем этапе code (то есть Access Token), client_id и client_secret. Дополнительно модуль Kohana OAuth добавляет grant_type=authorization_code. В ответ выдается строка с параметрами (что-то вроде ‘a=1,b=2,c=3′, некоторые провайдеры отдают JSON). Access Token лежит в параметре с именем access_token.

Далее можно дергать собственное API провайдера, чтобы получить полноценный профиль пользователя (это если используем OAuth для регистрации без пароля), либо что-то другое (получить список твитов, лайкнуть объект и тд). Обычно для этого используется GET-запрос с передачей Access Token в HTTP-заголовках. Такие запросы уже не требуют редиректа и могут выполняться AJAX’ом или через curl.

Провайдеры

Facebook

Github

Небольшой нюанс — Github требует обязательно передавать User-Agent в запросах к API.

Google

Google активно использует scopes. В частности, для получения в ответе поля email необходимо наличие scope со строкой email, например https://www.googleapis.com/auth/userinfo.email. Я использую scope «https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email«, чтобы получить профиль (id + name + avatar) + email.

LinkedIn

По умолчанию LinkedIn возвращает только сокращенный профиль (буквально имя, фамилию, УРЛ профиля и его заголовок), однако есть возможность получать более полный список. Для этого передавайте желаемые поля в адресе, например я запрашиваю расширенный профиль и email, вот так: https://api.linkedin.com/v1/people/~:(id,first-name,last-name,date-of-birth,picture-url,email-address). Чтобы это сработало, при авторизации (endpoint url_authorize) должны быть разрешены роли r_fullprofile и r_emailaddress. Это можно сделать, прописав их по умолчанию в настройках приложения, либо передавая их через пробел в параметре scope при запросе Request Token.

LinkedIn на момент написания статьи не поддерживал Bearer Token, поэтому в вызовах API необходимо использовать заголовок «Authorization: OAuth …» или передавать значение Access Token в УРЛе в параметре oauth2_access_token.

VK

  • Регистрация приложений
  • Авторизация через OAuth
  • url_authorize: http://oauth.vk.com/authorize
  • url_access_token: https://oauth.vk.com/access_token
  • Получение профиля пользователя по УРЛу https://api.vk.com/method/users.get. По умолчанию используется формат JSON, если необходим XML, добавляем расширение к УРЛу: https://api.vk.com/method/users.get.xml. Требует передавать в качестве параметра uid пользователя, просто добавляем к УРЛу uids={uid}, нужное значение uid возвращается вместе с Access Token, параметр user_id. В случае с модулем Kohana OAuth, это значение сохраняется в объекте токена.

По умолчанию в профиле возвращаются поля uid, first_name, last_name. Обычно этого недостаточно, поэтому стоит явно указывать необходимые поля, перечисляя их в параметре fields. Например: fields=uid,first_name,last_name,nickname,sex,bdate,city,country,photo.

Яндекс

При регистрации Яндекс не выдает client_secret. При использовании модуля Kohana OAuth, просто в конфиге oauth.php укажите 'secret' => ''.

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Опубликовано в новости.

Теги: , , , , , , , , .


Комментарии (2)

Будьте в курсе обсуждения, подпишитесь на RSS ленту комментариев к этой записи.

  1. Alfredo пишет:

    how i use this?
    excuse me i am a begginner



Можно включить подсветку кода: <code><pre lang="">...</pre></code>
Разрешены некоторые HTML теги

или используйте trackback.