Ошибка при создании токена в расширении js chrome при попытке проверить его на внутреннем сервере nodejs - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь сгенерировать токен в расширении chrome, а затем использовать его для проверки запросов к внутреннему серверу. Я успешно создал токен во внешнем интерфейсе, но когда я отправляю его бэкенду и проверяю его с помощью библиотеки nodejs google-auth-library, но всегда получаю ошибку Error: Wrong number of segments in token: [TOKEN_HERE].

Я пытался выяснить, как исправить это онлайн, и ничего, что я нашел, не работает. Идентификатор моего внутреннего номера совпадает с идентификатором в консоли.

Я создал приложение расширения Chrome в консоли разработчика и добавил его в свой манифест:

"oauth2": {
    "client_id": "THE ID",
    "scopes":["https://www.googleapis.com/auth/classroom.topics.readonly", "https://www.googleapis.com/auth/classroom.topics","https://www.googleapis.com/auth/classroom.courses.readonly", "https://www.googleapis.com/auth/classroom.rosters.readonly", "https://www.googleapis.com/auth/classroom.student-submissions.me.readonly"]
  },
...
"permissions": [
    "identity",
],

Как только я запустил код

chrome.identity.getAuthToken({interactive: true}, function(token) {
    console.log(token);
});

Он генерирует токен, который я смог проверить в расширении с помощью:

var x = new XMLHttpRequest();
x.open('GET', 'https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token=' + token);

Это также сгенерировало новый клиент oAuth2 в моей консоли, который является веб-приложением: https://i.imgur.com/uH789P8.png

На внутреннем сервере nodejs я попытался использовать оба сгенерированных идентификатора для проверки токена. Приложение расширения не имеет секрета клиента, но веб-приложение имеет. Я пытался использовать секрет с идентификатором веб-сервера, но это тоже не сработало.

Этот код для проверки бэкэнда:

const { OAuth2Client } = require('google-auth-library');
const authClient = new OAuth2Client(CLIENT_ID);

async function verify(token) {
  const ticket = await authClient.verifyIdToken({
      idToken: token,
      audience: [CLIENT_ID]  // Specify the CLIENT_ID of the app that accesses the backend
      // Or, if multiple clients access the backend:
      //[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]
  });
    const payload = ticket.getPayload();
    return {
        domain: payload['hd'],
        userid: payload['sub']
    }
}

Я хочу проверить токен с помощью этого кода, но он не может этого сделать. Каждый раз, когда я использую токен, который можно проверить с помощью запроса xhr, он просто выдает ошибку Error: Wrong number of segments in token. Я понятия не имею, куда идти отсюда, так как документации немного. Вся помощь приветствуется!

РЕДАКТИРОВАТЬ: Я также пытался проверить токен с префиксом Bearer, он не работал.

РЕДАКТИРОВАТЬ 2: Я понял проблему! ... просто не решение. Буду обновлять, когда я это выясню. Просто чтобы вы знали причину, по которой это не работает, в том, что способ, которым я пытался получить токен, дал мне токен доступа, а не идентификационный токен. Я собираюсь попытаться выяснить, как проверить токены доступа и многое другое.

1 Ответ

0 голосов
/ 19 мая 2019

Если вы хотите проверить токен доступа (полученный из chrome.identity) на бэкэнд-сервере, используйте следующий код:

const { OAuth2Client } = require('google-auth-library');
const authClient = new OAuth2Client(CLIENT_ID, CLIENT_SECRET);

authClient.getTokenInfo(token)

Если из-за ошибки authClient.getTokenInfo (token) произойдеттокен недействителен.

...