我在Battle.net API上使用带有express的Nodejs来生成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=HEREISMTOKEN
我收到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()获取一个公会的成员。
我已经尝试过:
创建新的应用程序(具有新的客户端机密和ID)
在战网设置中设置所有可能的回调url:
https://localhost/http://localhost/https://localhost:443/http://localhost:443/https://localhost/auth/bnet/callbackhttp://localhost/auth/bnet/callbackhttps://localhost:443/auth/bnet/callbackhttp://localhost:443/auth/bnet/callback
通过"尝试api"手动创建令牌(https://develop.battle.net/documentation/api-reference/world-of-warcraft-community-api),您可以在其中输入客户端ID和机密,然后获得临时令牌。这一点也适用于我的应用程序。
您可以比较这两个URL的响应(只需使用浏览器):
第一个(在我的应用程序中生成):https://eu.api.blizzard.com/wow/guild/Blackmoore/The%20new%20Dimension?fields=members&locale=de_de&access_token=EU7XD8E4K9IAJKBGJSP3DBLAVCIU2BYXS
第二(生成在战网网站上试用API,在那里您填写客户端ID和机密以测试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('/');
});
控制器.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回调中间件解决了这个问题:将我使用的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(快速会话)中也使用了"代码"或"令牌"来将当前会话存储在我的数据库中。所以我只是从请求中破解user.token并使用它。Phew。。工作时间。
从文档中我可以看到,您需要将令牌传递到值为:Bearer HEREISMYTOKEN
的Authorization
标头中。
有关授权标题和标题的更多信息,请点击此处:
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization
- https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#Headers
关于如何使用它的示例可以在这个SO答案中找到