API Battle.net возвращает ошибку 401 при использовании токена OAuth - PullRequest
0 голосов
/ 05 января 2019

Я использую Nodejs с экспрессом в API Battle.net для генерации Oauth-токена. https://develop.battle.net/documentation/guides/using-oauth

Генерация токена сама по себе работает, так как он возвращает мне токен. Но когда я использую код, чтобы сделать запрос к их API, например:

https://eu.api.blizzard.com/wow/guild/Malfurion/The%20new%20Dimension?fields=members&locale=de_DE&access_token=HEREISMYTOKEN

Я получаю 401 ответ несанкционированной ошибки, журнал отладки:

{ url:
      'https://eu.api.blizzard.com/wow/guild/Malfurion/The%20new%20Dimension?fields=members&locale=de_DE&access_token=HEREISMYTOKEN',
     status: 401,
     statusText: 'Unauthorized',
     headers: Headers { [Symbol(map)]: [Object] } }

Я пытаюсь вызвать членов гильдии с помощью fetch ().

Я уже пробовал:

Вы можете сравнить ответ этих двух URL (просто используйте ваш браузер):

Первый (генерируется в моем приложении): https://eu.api.blizzard.com/wow/guild/Blackmoore/The%20new%20Dimension?fields=members&locale=de_DE&access_token=EU7XD8E4K9IAJKBGJSP3MDBLAVCIU2BYXS

Второй (генерируется при тестировании API на веб-сайте battle.net, где вы вводите данные о клиентах и ​​секретные данные для проверки API): https://eu.api.blizzard.com/wow/guild/Blackmoore/The%20new%20Dimension?fields=members&locale=de_DE&access_token=US23su4g0hAeS5w3EUCkKA9MJPgJ8k8bzV

КОД

server.js, простое экспресс-приложение

var BNET_ID = "MYID";
var BNET_SECRET = "MYSECRET";

...

// Use the BnetStrategy within Passport.
passport.use(
  new BnetStrategy(
    { clientID: BNET_ID,
      clientSecret: BNET_SECRET,
      scope: "wow.profile sc2.profile",
      callbackURL: "https://localhost/",
      region: "eu" },
    function(accessToken, refreshToken, profile, done) {
      process.nextTick(function () {
        return done(null, profile);
      });
    })
);
// bnet auth routes
app.get('/auth/bnet', passport.authenticate('bnet'));

app.get('/auth/bnet/callback',
    passport.authenticate('bnet', { failureRedirect: '/' }),
    function(req, res){
        res.redirect('/');
});

controller.js

...

      const res = await fetch(`https://eu.api.blizzard.com/wow/guild/${servers[iterator]}/The new Dimension?fields=members&locale=de_DE&access_token=${thetoken}`).then((res) => {
        res.json();
        // for debugging, shows 401 Error
        console.log(res);
      });

...

На самом деле я ожидаю такого ответа, потому что он работает с использованием временного токена:

status: 200 OK

body: {
  "lastModified": 1546676373000,
  "name": "The new Dimension",
  "realm": "Blackmoore",
  "battlegroup": "Glutsturm / Emberstorm",
  "level": 25,
  "side": 0,
  "achievementPoints": 1005,
  "members": 
(......)
}

Мне удалось решить проблему!

Очень, очень хакерский, но мне удалось решить проблему, взломав промежуточное программное обеспечение oauth callback следующим образом: установите мой использованный токен API в req.user.token.

app.get('/auth/bnet/callback',
    passport.authenticate('bnet', { failureRedirect: '/?error' }),
    function(req, res) {
      req.session.bnettoken = req.user.token;

      res.redirect('/');
    }
);

Я подозреваю, что "code" или "token" также используется в моем SessionStorage (express-session) для сохранения текущего сеанса в моей базе данных. Поэтому я просто взламываю user.token из запроса и использую его. Фу .. Часы работы.

1 Ответ

0 голосов
/ 05 января 2019

Из документации видно, что вам нужно передать токен в заголовок Authorization со значением: Bearer HEREISMYTOKEN.

Подробнее о заголовке авторизации и заголовках здесь:

Пример того, как его использовать, можно найти в этом SO-ответе

...