Содержание

Авторизация в Яндекс Директ

Авторизация в Яндекс Директ
Alexey Seleznev
2023-03-17

Видео инструкция по авторизации

Для быстрого старта вы можете посмотреть этот видео урок посвящённый авторизации в API Яндекс.Директ с помощью пакета ryandexdirect.

Получение токена

Для генерации токена в пакете есть две функции, yadirAuth() и yadirGetToken(). Получить токен можно с помощью любой из этих функций, но я рекомендую использовать yadirAuth, функция yadirGetToken() считается устарвшей начиная с ryandexdirect 3.0.0.

Разница между ними состоит в том, что yadirGetToken() просто генерирует токен и перенаправляет вас на страницу где вы можете его скопировать, а yadirAuth первый раз направляет вас на старницу где будет сгенерирован код для получения токена, после чего сама запрашивает токен и сохраняет в файл, в дальнейшем сама его обновляет и работает с сохранённым файлом.

Вы можете передавать токен в виде строки в агрумент Token при работе с любой из функций, но этот метод является устаревшим и не эффективным способом работы с функциями пакета ryandexdirect.

В версии 3.5.0 в пакет была добавлена новая функция для прохождения аутентификации в API yadirAuth(), но отдельно вызывать её для получения токена больше не требуется, при любом обращении к API если вы в используемой функции явно не указываете никакой токен, любая функция пакета сначала будет искать файл с сохранёнными учётными данными в рабочей директории, или в папке которую вы укажите в аргументе

AgencyAccount, если файл найден то учётные данные будут загружены из него, если файл не был найден то будет открыт браузер и вам потребуется разрешить приложению ryandexdirect доступ к своему рекламному аккауну, далее будет сформирован код авторизации, который вам необходимо вставить в R консоль в ответ на запрос “Enter authorize code:”, после чего функция сама сохранит учётные данные в файл с именем login. yadirAuth.RData, где вместо login будет подставлен логин аккаунта к которому вы предоставили доступ, это необходимо для сохранения токенов полученных для разных аккаунтов. При следующих обращениях, все функции пакета будут запрашивать токен из сохранённого файла.

Пример кода для прохождения авторизации

aut <- yadirAuth(Login = "Ваш логин в яндексе", NewUser = TRUE, TokenPath = "token_yandex")

Обновление токена

При каждом обращении к API проверяется количество дней до того как используемый токен станет просроченным, если остаётся менее 30 дней токен автоматически будет обновлён, и файл с учётными данными перезаписан.

Аргументы функции yadirAuth

  • Login — имя пользователя или электронный адрес на Яндексе, с которого есть доступ к нужному вам рекламному аккаунту
  • NewUser — логическое выражаение TRUE или FALSE, признак того, что у пользователя обязательно нужно запросить разрешение на доступ к аккаунту (даже если пользователь уже разрешил доступ данному приложению).
    Получив этот параметр, Яндекс.OAuth предложит пользователю разрешить доступ приложению и выбрать нужный аккаунт Яндекса. Параметр полезен, например, если вы хотите переключиться на другой аккаунт. По умолчанию установлено значение FALSE.
  • TokenPath — путь к папке, в которой будут сохраняться учётные данные, по умолчанию это рабочая директория, но можно указывать любой путь, как абсолютный например “C:/my_r_files/tokens”, так и относительный “tokens”, при использовании относительного пути в рабочей директории будет создана папка с установленным вами названием, и в неё будут сохраняться файлы с расширением .RData в которых хранятся учётные данные.

Ещё раз обращаю внимание на то, что хоть вы в любой момент при желании можете пройти аутентификацию в API Яндекс Директ с помощью функции yadirAuth, но это действие не является обязательным, т.к. при использовании любой функции пакета будет запущен поиск файла с учётными данными, и если файл не будет найден, то автоматически будет запущен процесс авторизации и запроса токена.

Авторизация с помощью функции

yadirGetToken()

Функция для получения токена для доступа к API Яндекс.Директ с помощью упрощённой одноэтапной аутентификации. Полученый токен используется во всех остальных функциях. Перед запуском функции необходимо авторизироваться в яндексе под логином через который есть доступ к аккаунту Яндекс.Директ, далее запустить функции, в окне браузера подтвердить разрешение на доступ к данным.

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

Можно получить токен воспользовавшись кнопкой

Ещё один способ получить токен, скопировать его, и использовать во всех остальных функциях как обычную текстовую строку.

Получить токен доступа к API!


Если у вас не отображается кнопка перейдите на страницу официальной документации ryandexdirect по этой ссылке.

Аргументы, общие для всех функций

Во всех функции пакета существуют общие аргументы, в дальнейшем эти аргументы рассматриваться в описании функций не будут.

  • Login / Logins — Логин или вектор содержащий логины клиентов агентского аккаунта, в этот аргумент необходимо указывать логин в случае если вы запрашиваете данные из обычного рекламного аккаунта Яндекс Директ, или же логин клиентского аккаунта привязаного к вашему агентскому аккаунту, в таком случае в рабочей директории будет создан отдельный файл под каждый рекламный аккаунт, в котором будут хранится нужные для работы учётные данные.
  • Token — С версии 3.0.0 этот аргумент больше не является обязательным, вы по прежнему можете передавать в него токены в виде строки, полученные с помощью функции yadirGetToken, так же можете передавать объекты учётных данных полученные с помощью новой функции yadirAuth, либо просто опустить данный агрумент.
  • AgencyAccount — В случае если вы работаете с агентского аккаунта в этот аргумент необходимо передавать логин вашего агентского аккаунта, для каждого агентского аккаунта с которым вы работаете так же будет создан отдельный файл для хранения учётных данных.
  • TokenPath — Путь к папке в которой хранятся все файлы с учётными данными, по умолчанию все функции пакета пытаются найти нужный файл с хранящимися учётными данными в текущей рабочей директории, но вы можете указывать абсолютный или условный путь к совершенно любой папке на вашем ПК, в которой вы хотите хранить все учётные данные ваших аккаунтов Яндекс Директ. Пример условного пути TokenPath = “yandex_token”, в таком случае в рабочей директории будет создана папка yandex_token в которую и будут сохраняться все учётные данные, указав этот путь во всех функциях пакета вам не понадобится повторно запрашивать токены.

Работа с обычным рекламным аккаунтом

Таким образом при работе с обычным рекламным аккаунтом вам необходимо передавать логин этого аккаунта в аргументе Login или Logins. При запуске любой функции в первую очередь будет запущен процесс поиска учётных данных для заданного логина в папке, название или путь к которой указан в аргументе TokenPath. Если файл с учётными данными для заданного логина был найден то работа функции будет продолжена без вашего вмешательства, если учётные данные для данного логина ещё не были получены, или были получены но вы не указали путь к папке в которой данный файл был сохранён то автоматически будет запущен веб браузер и вам потребуется пройти авторизацию и разрешить доступ пакету ryandexdirect к вашему рекламному аккаунту, учётные данные при этом будут сохранены в локальный файл и при дальнейшей работе будут загружаться именно из файла.

Работа с агентским аккаунтом

Для получения статистики по рекламным аккаунтам прикреплённым к агентскому аккаунту необходимо использовать аргумент AgencyAccount, в который необходимо передать логин или почту для вашего агентского аккаунта, а в аргумент Login / Logins передавать логин клиента, или вектор содержащий логины клиентов данного агентского аккаунта, по которым вы хотите запросить какие либо данные или совершить ещё какие либо действия.

Авторизация в данном случае будет проходить по агентскому аккаунту.

Функции для переключения между аккаунтами

Прописывать в каждой отдельной функции аргументы Login, TokenPath, AgencyAccount неудобно, особенно если в ходе сессии работаете только с одним аккаунтом.

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

  • yadirSetLogin() — позволяет вам установить логин который будет использоваться в ходе сессии по умолчанию, так же в ходе сессии с помощью этой функции вы можете переключаться между аккаунтами.
  • `yadirSetAgencyAccount() — позволяет вам установить логин центра клиентов который будет использоваться в ходе сессии по умолчанию, так же в ходе сессии с помощью этой функции вы можете переключаться между центрами клиентов к которым у вас есть доступ.
  • yadirGetLogins() — позволяет вам запросить логины всех аккаунтов к которым вы сгенерировали и созранили учётные данные, далее, при работе в интерактивном режиме функция выведит их список, и вы можете указать номер аккаунта, который будет установлен в текущей сессии по умолчанию.

Опции и переменные среды

Ещё одна возможность избежать дублирования кода — установить дефолтные значения через опции или переменные среды.

Опции

Пакет ryandexdirect на данный момент поддерживает следующие опции:

  • ryandexdirect.user — логин по умолчанию
  • ryandexdirect.agency_account — логин центра клиентов по умолчанию
  • ryandexdirect.token_path — путь к директории в которой хранятся файлы с полученными учётными данными

Устанавливаются опции с помощью команды options().

options(ryandexdirect. user = 'my_yandex_login',
        ryandexdirect.agency_account = 'my_client_centre_login',
        ryandexdirect.token_path = 'C:/auth/yandex_direct')

Используя пример кода для установки опций вам необходимо подставить значения вместо:

  • my_yandex_login — логин подчинённого аккаунта, или обычного аккаунта яндекс директ
  • my_client_centre_login — логин центра клиентов, если указанный вами подчинённый аккаунт является клиентом в вашем центре клиентов
  • ‘C:/auth/yandex_direct’ — путь к директории в которой хранятся, или будут хранится учётные данные полученные вами при авторизации

Переменные среды

Помимо опций ryandexdirect поддерживает работу с переменными среды, их можно установить, что бы не прописывать в каждом отдельном скрипте опции.

На данный момент поддерживаются следующие переменные среды:

  • RYD_USER — логин по умолчанию
  • RYD_AGENCY — логин центра клиентов по умолчанию
  • RYD_TOKEN_PATH — путь к директории в которой хранятся файлы с полученными учётными данными

Прописать переменные среды можно либо в файле . Renviron

RFB_USER="my_yandex_login"
RFB_TOKEN_PATH="C:/auth/yandex_direct"

Либо вы можете использовать команду Sys.setenv():

Sys.setenv(RFB_USER="my_yandex_login"
           RFB_TOKEN_PATH="C:/auth/yandex_direct")

Либо использовать возможности вашей операционной системы, для создания переменных среды.

Функции для быстрого переключения между аккаунтами

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

  • yadirGetLogins() — Показывает все логины под которыми вы прошли авторизацию, при этом запрашиваются те логины которые учётные данные которых сохраненны в указанной папке с помощью аргумента TokenPath, либо опции ryandexdirect. token_path или переменной среды RYD_TOKEN_PATH.
  • yadirSetLogin() — Позволяет установить дефолтный логин, который будет использоваться в рамках сессии.
  • yadirSetAgencyAccount() — Позволяет установить дефолтный центр клиентов, который будет использоваться в рамках сессии.

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

Яндекс OAuth авторизация в iOS / Хабр

Для вызовов API Яндекса приложению нужен токен. Получить его можно двумя способами. Первый способ самый простой — спрашиваем у пользоватея его логин и пароль и делаем POST-запрос на oauth.yandex.ru/token. Но есть пара проблем: пользователь может не захотеть доверить свой пароль от учетной записи стороннему приложению, да и сам Яндекс не рекомендует так делать. Второй немного более сложный в реализации способ и является предметом топика — OAuth авторизация.

Регистрация приложения
Процедура подробно описана на api.yandex.ru/oauth/doc/dg/tasks/register-client.xml.

На этапе регистрации придумываем url-схему

И запоминаем Id приложения

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

Тут возможны два подхода.
1) Регистрируем приложение обработчиком указанной URL-схемы в системе. Открываем пользователю Safari с формой авторизации и ждем перезапуска приложения.
Регистрация приложения обработчиком URL-схемы подробно описана здесь

2) Показываем UIWebView и в его делегатских методах отлавливаем переход по нашей схеме.

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

Пишем код
Создаем тестовый проект в XCode.

Добавляем в проект YandexOauthViewController.* (ссылка на исходный код в конце статьи).

В YandexOauthViewController.h изменяем в следующих строках значения на ваши:

#define URL_SCHEME @"iostestapp"
#define CLIENT_ID @"6ef1c6dc6f134a2daa67cc905e5c1a3d"

Во ViewController.h импортируем YandexOauthViewController.h и обявляем себя «реализатором» протокола YandexOauthViewControllerDelegate.

#import <UIKit/UIKit.h>

#import «YandexOauthViewController.h»

@interface ViewController : UIViewController <YandexOauthViewControllerDelegate>

@end

В тестовом приложении будем авторизировать пользвателя при запуске. Для этого во ViewController.m изменяем метод ViewDidLoad:

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    
    YandexOauthViewController *cntrl = [[YandexOauthViewController alloc] init];
    cntrl. delegate = self;
    [self.navigationController presentModalViewController:cntrl animated:YES];
}

Какой еще self.navigationController, спросите вы и будете правы — навигейшен контроллера еще нет, поэтому добавляем его в AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:self.viewController];
    
    self.window.rootViewController = nav;
    [self.window makeKeyAndVisible];
    return YES;
}

Запускаем приложение и видим так нужную нам форму авторизации.

Кнопка слева (с крестиком) убирает форму авторизации с экрана, а правая кнопка возвращает пользователя на страницу авторизации. Дело в том, что в некоторых случаях Яндекс теряет цель нашего захода в авторизацию и и отображает профиль пользователя из которого нам токен уже не передадут.

После ввода логина пароля и, в некоторых случаях, подтверждения постоянной авторизации на данном устройстве Яндекс перенаправляет нас по URL-схеме указанной прирегистрации приложения. Рассмотрим перехват этого перехода в файле YandexOauthViewController.m.

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    //Получаем URL
    NSURL *url = [request URL];
    
    //Проверяем на соответствие пользовательской URL-схеме
    if ([url.scheme isEqualToString:URL_SCHEME])
    {
        //убираем индикатор сетевой активности
        UIApplication* app = [UIApplication sharedApplication];
        app.networkActivityIndicatorVisible = NO;
        
        //разбираем URL на отдельные элементы
        //наш токен будет в массиве arr под индексом 2
        NSArray *arr = [[url description] componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"#=&"]];
        
        //говорим делегату об успешной авторизации и передаем токен
        if ([delegate respondsToSelector:@selector(yandexOauthViewController:succesfullLoginWithToken:)])
        {
            [delegate yandexOauthViewController:self succesfullLoginWithToken:[arr objectAtIndex:2]];
        }
        
        //запрещаем UIWebView открывать URL
        return NO;
    }
    
    //разрешаем UIWebView переход по URL
    return YES;
}

Осталось в ViewController. m реализовать протокол YandexOauthViewControllerDelegate.

- (void)yandexOauthViewController:(YandexOauthViewController *)controller 
         succesfullLoginWithToken:(NSString *)token
{
    [self.navigationController dismissModalViewControllerAnimated:YES];
    
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Авторизация удалась" 
                                                    message:[NSString stringWithFormat:@"Токен %@",token]                                                    
                                                   delegate:nil 
                                          cancelButtonTitle:@"Ok" 
                                          otherButtonTitles:nil];
    
    [alert show];
}

Спасибо всем кто дочитал до этого места.

Ссылки
1) Проект: github.com/eltiren/YandexOauth
2) Документация по Яндекс OAuth: api.yandex.ru/oauth/doc/dg/concepts/About.xml

Срок действия кода авторизации Yandex Oauth всегда истек, Ruby On Rails

Я следовал этому руководству, чтобы внедрить Yandex Oauth в свое приложение Ruby On Rails. Несколько недель у меня не было проблем с этим, но недавно (несколько дней назад) у меня возникла проблема. Я не могу получить токен доступа, токен обновления и т. д., потому что мой запрос завершается с ошибкой 400.

Я получаю это конкретное сообщение:

 {"error_description": "Срок действия кода истек", "ошибка": "invalid_grant"}
 

От гида:

Срок жизни этого кода 10 минут. По истечении срока действия код должен запросить повторно.

Но он никогда не ждет 10 минут или даже 10 секунд, потому что, как только мое приложение получает код авторизации, оно сразу же делает запрос POST, чтобы изменить этот код авторизации для токена доступа, токена обновления и истечения срока действия. Но этот запрос POST терпит неудачу, потому что срок действия этого кода авторизации истек.

Из описаний ошибок Яндекса:

invalid_grant ― Недействительный или просроченный код авторизации.

Мой код:

 деф яндекс
    требуется 'сеть/http'
    требуют 'json' # => ложь
    @user = User. from_omniauth(request.env["omniauth.auth"])
    @client_id = Rails.application.secrets.client_id
    @secret = Rails.application.secrets.password
    @authorization_code = параметры[:код]
    @user.update_attribute(:code, @authorization_code)
    @user.update_attribute(:состояние, параметры[:состояние])
    @post_body = "grant_type=authorization_code&code=#{@authorization_code}&client_id=#{@client_id}&client_secret=#{@secret}"
    @url = "https://oauth.yandex.ru/token"
    URL-адрес = URI.parse(@url)
    req = Net::HTTP::Post.new(url.request_uri)
    req['host'] ="oauth.yandex.ru"
    req['Content-Length'] = @post_body.length
    req['Content-Type'] = 'application/x-www-form-urlencoded'
    req.body = @post_body
    http = Net::HTTP.new(url.host, url.port)
    http.use_ssl = (url.scheme == "https")
    @response_mess = http.request(req)
    Refreshhash = JSON.parse(@response_mess.body)
    access_token = updatehash['access_token']
    Refresh_token = RefreshHash['refresh_token']
    access_token_expires_at = DateTime. now + refreshhash["expires_in"].to_i.seconds
    если access_token.присутствует? && refresh_token.present? && access_token_expires_at.present?
        @user.update_attribute(:access_token, access_token)
        @user.update_attribute(:refresh_token, refresh_token)
        @user.update_attribute(:expires_in, access_token_expires_at)
        sign_in(@пользователь)
        redirect_to admin_dashboard_index_path
    конец
конец
 

Мой журнал:

 Начал GET "/users/auth/yandex/callback?state=31c11a86beecdeb55ab30887d56391a8cbafccdc85c456aa&code=5842278" для 212.3.192.116 в 2017- 04-05 15:58:27 +0300
Не удается отобразить консоль с адреса 212.3.192.116! Разрешенные сети: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Обработка CallbacksController#yandex как HTML
  Параметры: {"state"=>"31c11a86beecdeb55ab30887d56391a8cbafccdc85c456aa", "code"=>"5842278"}
 

Я попробовал тот же запрос POST в CHROME POSTMAN и получил тот же ответ, что и {"error_description": "Срок действия кода истек", "error": "invalid_grant"}

Погуглил, но похожего вопроса нет. . Вроде проблема на стороне Яндекса, но как обойти?

Будем признательны за любую помощь.

Интеграция с Яндекс-Трекером

Возможности

Для интеграции с Яндекс Трекером доступны следующие возможности:

  • Тестовое соединение
    • Allure TestOps может проверить правильность предоставленных учетных данных
    • Разрешения не могут быть проверены
  • Ошибка операции синхронизации
  • Операция по предложению проблемы
    • Allure TestOps может получать и фильтровать список проблем из трекера на основе данных, введенных конечным пользователем
  • Операция создания проблем
    • Проблемы могут быть созданы из дефектов
  • Экспорт операции запуска
    • Если запуск связан с какой-то проблемой, то ссылка на этот запуск будет добавлена ​​к указанной задаче в качестве комментария

Для интеграции с ЯндексТрекером необходимо выполнить 2 шага:

  1. Создать токен OAuth3 на стороне облака Яндекса
  2. Добавить интеграцию на стороне TestOps

Создать токен OAuth3 на стороне Яндекса

Чтобы иметь возможность использовать ЯндексТрекер, вам необходимо правильно пройти аутентификацию на стороне Яндекса.

Создание параметров аутентификации описано в официальной документации Yandex Cloud

https://cloud.yandex.com/ru/docs/tracker/concepts/access

Во-первых, вам необходимо авторизоваться на https://yandex.com/dev/

  1. Открыть https://oauth.yandex.com/client/new
  2. Добавить имя службы
  • например AllureIntegration

3.Выберите «Для какой платформы требуется приложение?» и нажмите «Вставить URL для разработки».

  1. Далее для пункта Ссылка на сайт выберите Вставить URL для разработки и нажмите Создать приложение

  1. Вы будете перенаправлены на страницу созданного приложения, сюда нужно скопировать ClientID (обратите внимание, что срок действия токена — 1 год)

  1. Далее необходимо создать и перейти по ссылке:

https://oauth. yandex.com/authorize?response_type=token&client_id=application_ID

где application_ID — ваш текущий CLientID из пункта 5

  1. Подтвердить авторизацию, если требуется

  2. Теперь ваш токен OAuth3 создан и включен

Добавить интеграцию на стороне TestOps

Общее описание включения интеграции описано в разделе Интеграция.

Обзор интеграции

  1. Создайте (получите/создайте/назовите его) секреты (учетные данные) во внешней системе для использования их API.
  2. Добавьте необходимую интеграцию на глобальном уровне Allure TestOps (необходимо быть администратором или иметь поблизости администратора).
  3. Добавьте необходимую интеграцию на уровне проекта и предоставьте учетные данные (секреты), которые вы получили на шаге 1.

Глобальный уровень

Для настройки экземпляра Allure TestOps на глобальном уровне необходимы полномочия ROLE_ADMIN .

  1. Перейдите в Меню пользователя > Администрирование > Интеграция
  2. В правом верхнем углу нажмите Добавить интеграцию
  3. Поиск Яндекс Трекера
  4. Нажмите на баннер Яндекс Трекера
  5. Укажите имя интеграции
  6. Укажите URL-адрес Яндекс Трекера (скорее всего, это будет https://tracker.yandex.com ).
  7. Allure TestOps будет использовать конечную точку API по умолчанию как https://api.tracker.yandex.net как конечную точку , если вы оставите это поле пустым.
    • не обновляйте этот параметр, если только ваш экземпляр не особенный.
  8. Завершить, нажав Добавить интеграцию .

Добавление Яндекс Трекера в ваш проект

Вы должны быть владельцем проекта для настройки этих параметров.

  1. Перейти к настройкам проекта.
  2. Перейти к Интеграция раздел
  3. Найдите интеграцию с Яндекс Трекером, которую хотите добавить.