Получение LinkedIn API AccessToken в расширении Google Chrome

Я разрабатываю расширение для Google Chrome и хочу разрешить пользователям входить в LinkedIn. Я следую приведенным здесь инструкциям по потоку кода авторизации LinkedIn, чтобы получить токен доступа пользователя.

Я добавил кнопку «Войти с помощью LinkedIn», которая успешно извлекает код авторизации пользователя после направления браузера пользователя на страницу авторизации LinkedIn OAuth 2.0 (шаг № 2 инструкций, связанных ранее). Это делается с помощью операции внутри chrome.identity библиотека.

Однако я изо всех сил пытаюсь реализовать рабочий процесс, необходимый для получения токена доступа пользователя из LinkedIn (шаг № 3 инструкций). LinkedIn требует, чтобы в запросе на получение токена доступа передавался uri перенаправления, а это означает, что для связи с LinkedIn из расширения Google Chrome я должен использовать его снова (на основе этого набора инструкций от Google о том, что делать не с Google аутентификация учетной записи в расширениях Chrome). Ниже приведены фрагменты моего кода, который пытается связаться с LinkedIn, используя токен доступа:

background.js

      // This is my code that sets up my auth request for the accessToken from LinkedIn.
// All of this code is actually within a larger async method that was omitted for simplicity.

let redirectUri = chrome.identity.getRedirectURL() + "provider_cb";
let code = <REDACTED>; // This was retrieved in step 2 earlier
let accessTokenReqUrl = 'https://www.linkedin.com/oauth/v2/accessToken'; 
let accessTokenReqDetails = {
    "grant_type": "authorization_code",
    "code": code,
    "client_id": <REDACTED>,
    "client_secret": <REDACTED>,
    "redirect_uri": redirectUri
};

// The code below encodes the required parameters for the request and appends them to the LinkedIn request url.
let encodedParams = [];
for (let property in accessTokenReqDetails) {
    let encodedKey = encodeURIComponent(property);
    let encodedValue = encodeURIComponent(accessTokenReqDetails[property]);
    encodedParams.push(encodedKey + "=" + encodedValue);
}
let params = encodedParams.join("&");
accessTokenReqUrl = accessTokenReqUrl + "?" + params;

let accessTokenResult = await launchExternalAuthFlow(accessTokenReqUrl, ____ /* This is the isInteractive value -> EXPLANATION BELOW */); 


// This function returns a promise so that my code can wait until the responseUrl is produced before continuing.
async function launchExternalAuthFlow(authUrl, isInteractive) {
  return new Promise((resolve, reject) => {
    try {
      chrome.identity.launchWebAuthFlow({ url: authUrl, interactive: isInteractive }, function (responseUrl) {
        resolve(responseUrl);
      });
    } catch (e) {
      reject("");
    }
  });
}

Я не вижу причин, по которым для обращения к LinkedIn за токеном доступа требуется взаимодействие с пользователем. Однако, когда я использую с включенным беззвучным режимом (значение в моем коде установлено на false), Я получаю сообщение об ошибке Unchecked runtime.lastError: User interaction required.

Когда я запускаю код с включенным взаимодействием ( isInteractive значение установлено как true), Я успешно получил токен доступа и срок его действия; однако он появляется в отдельном окне, открытом для взаимодействия с пользователем. У моего кода нет возможности получить доступ к JSON, показанному в этом окне, и я бы не хотел, чтобы окно было видимым для пользователя в первую очередь.

Мои два основных вопроса:

  1. Почему launchWebAuthFlow требуя, чтобы этот запрос выполнялся в интерактивном режиме?
  2. Как я могу успешно получить токен доступа к LinkedIn программным способом (а не в каком-то случайном всплывающем окне)?

0 ответов

Другие вопросы по тегам