Battle.net API使用OAuth令牌返回401错误

时间:2019-01-05 10:57:19

标签: node.js api express passport.js battlenet-api

我正在Battle.net API上使用带有Express的Node.js来生成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()获取公会的成员。

我已经尝试过:

您可以比较这两个网址的响应(只需使用浏览器即可):

第一(在我的应用程序中生成):https://eu.api.blizzard.com/wow/guild/Blackmoore/The%20new%20Dimension?fields=members&locale=de_DE&access_token=EU7XD8E4K9IAJKBGJSP3MDBLAVCIU2BYXS

第二(生成是在Battle.net网站上尝试API,您在其中填写了clientid和secret以测试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": 
(......)
}

我设法解决了这个问题!

非常非常hacky,但是我设法通过黑客入侵了oauth回调中间件来解决了这个问题: 将我使用的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('/');
    }
);

我怀疑在SessionStorage(express-session)中也使用了“代码”或“令牌”来将当前会话存储在数据库中。所以我只是从请求中窃取user.token并使用它。哎呀。工作时间。

1 个答案:

答案 0 :(得分:0)

从文档中,我可以看到您需要将令牌传递到Authorization头,其值为:Bearer HEREISMYTOKEN

有关授权标题和标题的更多信息,请点击此处:

如何使用它的示例可以在this SO answer

中找到