Нюансы двухфакторной аутентификации

Делал двухфакторную аутентификацию. И вот при получении Grant кода сервис меня не пускает — пишет неправильный код. Я и так и этак — а не получается:

Функция AuthCode(URL) Экспорт
   
НачалоКода = Найти(ВРЕГ(URL), ВРЕГ(«code=»));
    Если
НачалоКода = 0 Тогда
        Возврат
«»;
    КонецЕсли;
   
НачалоКода = НачалоКода + 5;
   
ПодURL = Сред(ВРЕГ(URL), НачалоКода);
   
КонецКода = Найти(ВРЕГ(ПодURL), ВРЕГ(«&»));
    Если
КонецКода = 0 Тогда
        Возврат
«»;
    КонецЕсли;
    Возврат
Сред(ПодURL, 1, КонецКода 1);
КонецФункции

Долго думал и гадал, потом заметил, что буквы в коде в верхнем регистре. Оказывается, зря я писал ВРЕГ когда получал ПодURL. Убрал ВРЕГ в этой строке и все заработало.

Но это еще не все. Зная одноразовый Grant токен, получаю Access токен, который действует пару часов и Refresh токен, который действует долго, месяцы:

    Command = «oauth/v2/token?code=» + GrantToken
    + «&scope=» + scope
    + «&client_id=» + client_id
    + «&client_secret=» + client_secret
    + «&grant_type=authorization_code»
   
+ «&state=testing»
   
+ «&redirect_uri=» + RedirectURI;

   
HTTPСоединение = Новый HTTPСоединение(adress, 443,,,,15, Новый ЗащищенноеСоединениеOpenSSL);
   
HTTPЗапрос = Новый HTTPЗапрос(Command);
   
Ответ = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    Если
Ответ.КодСостояния = 200 Тогда
       
//Успешно
       
СтруктураОтвета = _json_ПолучитьСтруктуруИзJSON(Ответ.ПолучитьТелоКакСтроку());
        Если НЕ
СтруктураОтвета.Свойство(«access_token») Тогда
           
Р.Ошибка = Ответ.ПолучитьТелоКакСтроку();
        Иначе
           
Р.AccessToken = СтруктураОтвета.access_token;
           
_zb_СохранитьAccessToken(Р.AccessToken);
            Если
СтруктураОтвета.Свойство(«refresh_token») Тогда
               
Р.RefreshToken = СтруктураОтвета.refresh_token;
               
_zb_СохранитьRefreshToken(Р.RefreshToken);
               
Р.ОК = истина;
            Иначе
               
Р.Ошибка = «Есть access, но нет refresh токена»;
            КонецЕсли;
        КонецЕсли;
    Иначе
       
Р.Ошибка = Ответ.ПолучитьТелоКакСтроку();
    КонецЕсли;

Так вот, обнаружил, что Refresh токен получается только при первом вызове. А я еще не успел занести его в память, отлаживал сервис. Что делать?

Оказывается, все просто, нужно отозвать разрешение приложения на доступ. И тогда заново выдастся Refresh токен — старый, естественно, станет недействительным.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

1 комментарий

  1. bob:

    Открытие Oauth2 в кои-то веки. Почитай чтоль для общего развития https://aaronparecki.com/oauth-2-simplified/

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *