Решил вот набросать список 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 обозначил свое OAuth 1.0 API как deprecated, поэтому его вы увидите в разделе OAuth v2.
- Документация по OAuth
- Регистрация приложений
url_request_token
: https://api.twitter.com/oauth/request_tokenurl_authorize
: https://api.twitter.com/oauth/authorizeurl_access_token
: https://api.twitter.com/oauth/access_token- Извлечение профиля пользователя. Ответ в JSON.
Все достаточно стандартно.
Обратите внимание, с 14.01.2014 все обращения к Twitter API работают только через HTTPS.
Yahoo
- Регистрация приложения
- Документация по реализации OAuth в Yahoo
url_request_token
: https://api.login.yahoo.com/oauth/v2/get_request_tokenurl_authorize
: https://api.login.yahoo.com/oauth/v2/request_authurl_access_token
: https://api.login.yahoo.com/oauth/v2/get_token- Получение профиля через УРЛ http://social.yahooapis.com/v1/user/{xoauth_yahoo_guid}/profile (поддерживаются форматы JSON и XML).
Для получения информации о пользователе нужен его ID. Идентификатор текущего пользователя возвращается вместе с
Access Token
(параметрxoauth_yahoo_guid
). Модуль OAuth сохранит его в объектеOAuth_Token_Access
Все еще поддерживает OAuth v1.0a, но рекомендует использовать v2.0. Поэтому в данном разделе его не будет, смотрите ниже.
Flickr
- Создание приложения.
- Документация по OAuth
url_request_token
: http://www.flickr.com/services/oauth/request_tokenurl_authorize
: http://www.flickr.com/services/oauth/authorizeurl_access_token
: http://www.flickr.com/services/oauth/access_token- Извлечение профиля по адресу http://api.flickr.com/services/rest/?method=flickr.people.getInfo&user_id={user_nsid}. Поле
user_nsid
(идентификатор пользователя) приходит вместе сAccess Token
. Поддерживается JSON (format=json&nojsoncallback=1
) и JSONP (format=json
), XML (format=rest
), сериализованный php-объект (format=php_serial
).
Tumblr
- Регистрация приложения
- Документация
url_request_token
: http://www.tumblr.com/oauth/request_tokenurl_authorize
: http://www.tumblr.com/oauth/authorizeurl_access_token
: http://www.tumblr.com/oauth/access_token- Извлечение профиля через УРЛ http://api.tumblr.com/v2/user/info. Поддерживается JSON/JSONP.
Что интересно, 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.
Провайдеры
- Документация, в частности по авторизации через OAuth
- Создать новое приложение
url_authorize
: https://www.facebook.com/dialog/oauthurl_access_token
: https://graph.facebook.com/oauth/access_token- Извлечение профиля пользователя (используйте УРЛ https://graph.facebook.com/me). Данные в JSON.
Github
- Документация по OAuth
- Регистрация приложений
url_authorize
: https://github.com/login/oauth/authorizeurl_access_token
: https://github.com/login/oauth/access_token- Получение профиля через УРЛ https://api.github.com/user, ответ в JSON.
Небольшой нюанс — Github требует обязательно передавать
User-Agent
в запросах к API.
- Добавить приложение
- Документация по OAuth v2
url_authorize
: https://accounts.google.com/o/oauth2/authurl_access_token
: https://accounts.google.com/o/oauth2/token- Извлечение профиля по УРЛу https://www.googleapis.com/oauth2/v1/userinfo. Ответ в JSON.
Google активно использует scopes. В частности, для получения в ответе поля
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
.
- Регистрация приложений
- Документация по использованию OAuth
url_authorize
: https://www.linkedin.com/uas/oauth2/authorizationurl_access_token
: https://www.linkedin.com/uas/oauth2/accessToken- Получение профиля по УРЛу https://api.linkedin.com/v1/people/~. По умолчанию данные в формате XML, но можно запросить их в JSON с помощью параметра
format=json
.
По умолчанию LinkedIn возвращает только сокращенный профиль (буквально имя, фамилию, УРЛ профиля и его заголовок), однако есть возможность получать более полный список. Для этого передавайте желаемые поля в адресе, например я запрашиваю расширенный профиль и
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/authorizeurl_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
.
Яндекс
- Регистрация приложений.
- Документация, в том числе по авторизации.
url_authorize
: https://oauth.yandex.ru/authorizeurl_access_token
: https://oauth.yandex.ru/token- Получение доступа к профилю (и вообще информация о доступе к API Яндекса). В зависимости от прописанных при создании приложения прав адрес для получения профиля будет меняться. Например, при включении прав на API Я.Ру используется адрес https://api-yaru.yandex.ru/me/, а через Яндекс.Логин — https://login.yandex.ru/info. По умолчанию данные в XML, можно затребовать их в JSON, для чего есть несколько способов, самый простой — передать
format=json
.
При регистрации Яндекс не выдает
client_secret
. При использовании модуля Kohana OAuth, просто в конфигеoauth.php
укажите'secret' => ''
.
how i use this?
excuse me i am a begginner
http://stackoverflow.com/questions/13884902/skipping-orm-validation-in-kohana-3-3/13886664#13886664