Пример: получение токена для веб-сервиса

Данный раздел демонстрирует получение авторизационного токенa приложениями.

Примечание. Рекомендации для различных типов приложений (настольное, мобильное и др.) приведены в руководстве по OAuth-авторизации.

Callback URI

При регистрации или редактировании параметров приложения на OAuth-сервере Яндекса необходимо в поле Callback URI указать URL скрипта, выполняющего получение токена. Например:

 http://site.ru/get_token.php

Код скрипта приведен ниже.

Последовательность действий

При запросе токена требуется указывать идентификатор и пароль приложения, сгенерированные при регистрации на OAuth-сервере.

  1. Приложение перенаправляет пользователя по ссылке вида
    https://oauth.yandex.ru/authorize?response_type=code&client_id=<идентификатор_приложения>

    На открывшейся странице пользователь нажимает кнопку Разрешить.

  2. OAuth-сервер Яндекса осуществляет редирект на адрес из Callback URI. При этом к адресу добавляется параметр code. Например:
     http://site.ru/get_token.php?code=<код_подтверждения>
  3. Скрипт выполняет POST-запрос на https://oauth.yandex.ru/token, передавая следующие параметры:
    • grant_type = authorization_code
    • code = <код_подтверждения>
    • client_id = <идентификатор_приложения>
    • client_secret = <пароль_приложения>
  4. 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)