You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中调用Bungie API的TokenURL接口获取OAuth访问令牌失败

Node.js中调用Bungie API的TokenURL接口获取OAuth访问令牌失败

我完全理解你现在的困扰——授权链接生成得好好的,拿到授权码后换令牌却一直碰400或401错误,这种卡壳的感觉真的让人头大。我帮你梳理几个最可能的问题点,以及对应的解决办法:


1. 别用btoa!Node.js里的Base64编码要换方式

浏览器里的btoa和Node.js环境的实现有差异,尤其是处理包含特殊字符的字符串时很容易出问题,这大概率是你拿到401的原因。你应该用Node.js原生的Buffer来生成Basic Auth的凭证:

// 替换原来的btoa写法
const basicAuth = Buffer.from(`${clientID}:${clientSecret}`).toString('base64');

2. 别忘了加redirect_uri参数

Bungie的OAuth机制要求,获取令牌时必须传入和授权请求时完全一致的回调地址,哪怕你在开发者后台已经配置过也不行。这个参数缺失很可能导致400错误,一定要加到请求体里:

body: new URLSearchParams({
    'client_id': clientID,
    'grant_type': 'authorization_code',
    'code': authCode,
    'redirect_uri': '你在Bungie后台设置的回调地址' // 必须和授权时的地址一模一样
}).toString()

3. 先确认环境变量是否正确加载

有时候问题出在最基础的地方:你可以先打印clientID和clientSecret的值,看看是不是undefined或者空字符串。如果是用dotenv加载环境变量,要确保在代码最开头就执行了require('dotenv').config()。

4. 检查授权码是否过期

Bungie的授权码有效期很短(一般只有几分钟),如果拿到授权码后隔了很久才请求令牌,就会失效导致错误。尽量在获取到授权码后立刻发起令牌请求。


修改后的完整代码示例

这里把所有修正点整合到一起,还加了错误详情的打印,方便你排查问题:

const crypto = require('crypto');
const fetch = require('node-fetch'); // Node.js环境需要先安装node-fetch: npm install node-fetch

const clientID = process.env.BNG_CLIENT_ID;
const clientSecret = process.env.BNG_CLIENT_SECRET;
const tokenURL = 'https://www.bungie.net/platform/app/oauth/token';
const authCode = '你拿到的授权码';
const redirectURI = '你在Bungie开发者后台配置的回调地址';

// 正确生成Basic Auth凭证
const basicAuth = Buffer.from(`${clientID}:${clientSecret}`).toString('base64');

fetch(tokenURL, {
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Authorization': `Basic ${basicAuth}`
    },
    body: new URLSearchParams({
        'client_id': clientID,
        'grant_type': 'authorization_code',
        'code': authCode,
        'redirect_uri': redirectURI
    }).toString()
})
.then(async res => {
    console.log('响应状态码:', res.status);
    // 如果请求失败,打印详细错误信息
    if (!res.ok) {
        const errorDetails = await res.text();
        console.error('API返回的错误详情:', errorDetails);
        return;
    }
    return res.json();
})
.then(tokenData => {
    console.log('成功获取令牌:', tokenData);
})
.catch(err => {
    console.error('请求过程出错:', err);
});

如果还是有问题,看看控制台打印的错误详情,Bungie的API会返回很具体的提示,比如“redirect_uri不匹配”或者“无效的授权码”,根据提示再调整就好啦。

备注:内容来源于stack exchange,提问作者TheKillerAxe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 13:34:33