Пример: получение токена для веб-сервиса
Данный раздел демонстрирует получение авторизационного токенa приложениями.
Примечание. Рекомендации для различных типов приложений (настольное, мобильное и др.) приведены в руководстве по OAuth-авторизации.
Callback URI
При регистрации или редактировании параметров приложения на OAuth-сервере Яндекса необходимо в поле Callback URI указать URL скрипта, выполняющего получение токена. Например:
http://site.ru/get_token.php
Код скрипта приведен ниже.
Последовательность действий
При запросе токена требуется указывать идентификатор и пароль приложения, сгенерированные при регистрации на OAuth-сервере.
- Приложение перенаправляет пользователя по ссылке вида
https://oauth.yandex.ru/authorize?response_type=code&client_id=<идентификатор_приложения>
На открывшейся странице пользователь нажимает кнопку Разрешить.
- OAuth-сервер Яндекса осуществляет редирект на адрес из Callback URI. При этом к адресу добавляется параметр
code
. Например:http://site.ru/get_token.php?code=<код_подтверждения>
- Скрипт выполняет POST-запрос на https://oauth.yandex.ru/token, передавая следующие параметры:
grant_type = authorization_code
code
= <код_подтверждения>client_id
= <идентификатор_приложения>client_secret
= <пароль_приложения>
- OAuth-сервер передает ответ в формате JSON. Ключ
access_token
содержит OAuth-токен. Например:{"access_token": "ea135929105c4f29a0f5117d2960926f"}
Полученный токен необходимо сохранить и использовать в запросах к API Директа.
Код скрипта
# -*- coding: utf-8 -*-
from bottle import route, run, request
import httplib
import urllib
import json
#Идентификатор приложения
client_id = 'YOUR_CLIENT_ID'
#Пароль приложения
client_secret = 'YOUR_CLIENT_SECRET'
@route('/')
def index():
#Если скрипт был вызван с указанием параметра "code" в URL,
#то выполняется запрос на получение токена
if request.query.get('code'):
#Формирование параметров (тела) POST-запроса с указанием кода подтверждения
query = {
'grant_type': 'authorization_code',
'code': request.query.get('code'),
'client_id': client_id,
'client_secret': client_secret,
}
query = urllib.urlencode(query)
#Формирование заголовков POST-запроса
header = {
'Content-Type': 'application/x-www-form-urlencoded'
}
#Выполнение POST-запроса и вывод результата
connection = httplib.HTTPSConnection('oauth.yandex.ru')
connection.request('POST', '/token', query, header)
response = connection.getresponse()
result = response.read()
connection.close()
#Токен необходимо сохранить для использования в запросах к API Директа
return json.loads(result)['access_token']
#Запускаем веб-сервер
run(host='localhost', port=80, quiet=True)
<?php
// Идентификатор приложения
$client_id = 'YOUR_CLIENT_ID';
// Пароль приложения
$client_secret = 'YOUR_CLIENT_SECRET';
// Если скрипт был вызван с указанием параметра "code" в URL,
// то выполняется запрос на получение токена
if (isset($_GET['code']))
{
// Формирование параметров (тела) POST-запроса с указанием кода подтверждения
$query = array(
'grant_type' => 'authorization_code',
'code' => $_GET['code'],
'client_id' => $client_id,
'client_secret' => $client_secret
);
$query = http_build_query($query);
// Формирование заголовков POST-запроса
$header = "Content-type: application/x-www-form-urlencoded";
// Выполнение POST-запроса и вывод результата
$opts = array('http' =>
array(
'method' => 'POST',
'header' => $header,
'content' => $query
)
);
$context = stream_context_create($opts);
$result = file_get_contents('https://oauth.yandex.ru/token', false, $context);
$result = json_decode($result);
// Токен необходимо сохранить для использования в запросах к API Директа
echo $result->access_token;
}
?>