Я создаю интеграцию Woocommerce API и работаю над функциями аутентификации. Для конечной точки авторизации требуются return_url
и callback_url
.
. У меня сложилось впечатление, что я могу использовать StateTokenBuilder
, аналогично тому, как работает библиотека OAuth2, но сталкиваюсь с проблемами, пытаясь реализовать на основе в документах Apps Script.
Конечно, UrlFetchApp для конечной точки Woocommerce работает нормально, но при попытке авторизации приложения в конечной точке я получаю следующую ошибку:
Ошибка: в запросе произошла ошибка, и в то время не удалось отправить данные потребителя.
После последующих тестов с почтальоном URL-адрес обратного вызова и обратный URL-адрес оцениваются на Google Диске spla sh страницы и не выполнять функцию в скрипте. Я не знаю, как получить доступ к функции обратного вызова из другого источника, так как кажется, что она доступна только через браузер при входе в систему.
Ниже приведены мои функции:
let endpoint = {
protocol: 'https',
base: '{URL}.com'
}
let params = {}
API.Auth.Authorize = options => {
endpoint = { ...endpoint, ...{ section: 'wc-auth/v1/authorize' } };
options = { ...params, ...options };
let method = 'GET';
const query =
method === 'GET' && typeof params === 'object'
? Object.keys(options)
.filter(param => param !== 'payload')
.map(param => `${param}=${encodeURIComponent(options[param])}`)
.join('&')
: options;
const url = `${endpoint.protocol}://${endpoint.base}/${endpoint.section}${typeof query === 'string' && query.length > 0 ? `?${query}` : ''}`;
let opts = {
method: method,
muteHttpExceptions: true
};
return url;
};
const authorize = () => {
const params = {
app_name: 'App Name',
scope: 'read_write',
user_id: 'abc123',
return_url: 'https://script.google.com/macros/s/{SCRIPT_ID}/exec',
callback_url: generateCallbackURL('handleCallback')
};
const result = API.Auth.Authorize(params);
console.log(result);
}
generateCallbackURL = fn => {
const script_url = `https://script.google.com/macros/d/${ScriptApp.getScriptId()}`;
const url_suffix = '/usercallback?state=';
const state_token = ScriptApp.newStateToken().withMethod(fn).withTimeout(120).createToken();
const callback_url = `${script_url}${url_suffix}${state_token}`;
return callback_url;
}
const handleCallback = e => {
return HtmlService.createHtmlOutput(JSON.stringify(e));
}
Я также попытался заменить функцию handleCallback
на функцию doPost
, чтобы определить, решит ли это проблему. Это не имело эффекта.