Нюансы двухфакторной аутентификации
Делал двухфакторную аутентификацию. И вот при получении 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 токен — старый, естественно, станет недействительным.
Открытие Oauth2 в кои-то веки. Почитай чтоль для общего развития https://aaronparecki.com/oauth-2-simplified/