Youtube OAuth promts окно авторизации каждый раз, когда я делаю запрос
вот мой рабочий поток для получения маркера доступа и токена обновления для YouTube api. Im генерации url авторизации с параметрами
access_type=offline, response_type=code, redirect_uri=uri, scope=scopes, state=state, client_id=id
из url авторизации Im, получающего код аутентификации, затем Im, генерирующий другой url, чтобы получить access_token и refresh_token, используя код из url авторизации с этими параметрами
код: код, client_id: CLIENT_ID, секрет клиента: секрет клиента, параметр redirect_uri: serviceCallback, состояние: состояние.обратного вызова, grant_type: "код"
насколько я знаю, пользователь должен завершить этот процесс только один раз, а затем она должна быть автоматической. Моя проблема в том, что Im всегда должен завершить авторизацию, и Im всегда получает новый access_token и refresh_token, не заставляя его по запросу.
вот часть кода, где я получаю проверки подлинности URL-адрес
getAuthUrl: function(scopes, applicationCallback, serviceCallback, siteId,
selectChannel, websiteUrl) {
var requestedClientId = CLIENT_ID;
var scopess =
"https://www.googleapis.com/auth/yt-analytics.readonly https://www.googleapis.com/auth/youtube.readonly https://www.googleapis.com/auth/userinfo.email " +
scopes.replace(",", " ");
return "https://accounts.google.com/o/oauth2/auth?" +
"access_type=offline" +
"&response_type=code" +
/*"&approval_prompt=auto" +*/
"&redirect_uri=" + serviceCallback +
"&scope=" + scopes +
"&state=" + JSON.stringify({
service: NAME,
callback: applicationCallback,
scopes: scopes,
siteId: siteId,
selectChannel: selectChannel,
websiteUrl: websiteUrl
}) +
"&client_id=" + requestedClientId;
},
оттуда я получаю код и используя этот код, clientID и clientSecret, чтобы получить токен доступа и обновить токен
getAuthTokens: function(code, state, res, serviceCallback) {
// Google oAuth endpoint
var endpoint = "https://www.googleapis.com/oauth2/v4/token";
const scopes = state.scopes.split(" ");
// Setup request data
var data = {
code: code,
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
redirect_uri: serviceCallback,
state: state.callback,
grant_type: "authorization_code"
};
request.post(endpoint).send(data).type('form').set('Accept',
'application/json').end(function(err, oAuthResponse) {});
},
я использовал неправильный url конечной точки, я изменил его на другой, предоставленный документацией YouTube api, и удалил параметр состояния из переменной данных, но все еще не исправил проблему
новый URL-адрес конечной точки
var endpoint = "https://accounts.google.com/o/oauth2/token";
Im действительно запутался прямо сейчас, потому что я не заставляю авторизацию и на раздел google apps есть мое приложение уже авторизовано, и оно не обновляет авторизацию, что означает, что оно дает разрешение только в первый раз, и после этого, когда я нажимаю кнопку Разрешить, он ничего не делает. OAuth должен проверить, есть ли у меня токен обновления или нет, поэтому мой вывод заключается в том, что я не полностью понимаю, как он должен работать, или Im каким-то образом тестирует все в отладочном или тестовом режиме, где приглашение авторизации автоматически принудительно.
Я был бы очень благодарен за любую помощь потому что я чувствую, что перепробовал все.
2 ответов
на вопрос это access token
Что вы используете истек до следующего раза, когда вы используете, как у вас есть не обновлял access token
вручную с помощью refresh token
.
вам нужно использовать refresh token
обновить access token
Если [(время последнего обновления маркера доступа) + (время истечения срока действия)] уже превзошло.
концепция обновления, что если маркер доступа взломан, а это недолговечный, злоумышленник имеет ограниченный период времени, в течение которого его можно использовать. обновления, если скомпрометированы, бесполезны, потому что злоумышленник требует идентификатор клиента и ключ в дополнение к маркер обновления, чтобы получить маркер доступа.
документация API YouTube демонстрирует процедуру здесь
по умолчанию время истечения составляет около 3 секунд.
Это конечно, работайте в вашем случае.