POST 请求基本授权 - 不适用于 Node.js 中的 Battle.net API

POST Request Basic Authorization - Not Working for Battle.net API in Node.js

我已经格式化了一个 axios post 请求如下:

    var config = {
        method: 'post',
        url: 'https://us.battle.net/oauth/token',
        headers: { 
            'Authorization': 'Basic '+process.env.BATTLENET_CLIENT+':'+process.env.BATTLENET_SECRET, 
            ...data.getHeaders()
        },
        data : data
    };

这被 401 拒绝了。但是,当我从 Postman 中为此生成代码片段时,其功能是相同的,除了授权是生成的看似随机的字符串:

var config = {
  method: 'post',
  url: 'https://us.battle.net/oauth/token',
  headers: { 
    'Authorization': 'Basic reallyRandomLongStringIsNotClientIDAndSecretKey=', 
    ...data.getHeaders()
  },
  data : data
};

将其插入我的代码使其工作。我很好奇在编写 Basic Auth 凭据时是否遗漏了什么,因为 Postman 似乎 converted/encrypted 把它变成了我无法弄清楚的东西?

您只需要将包含用户名和 password/secret 的字符串编码为 Base64,如下所示:

const encodedAuthorization = Buffer.from(`${process.env.BATTLENET_CLIENT}:${process.env.BATTLENET_SECRET}`).toString('base64')
 var config = {
        method: 'post',
        url: 'https://us.battle.net/oauth/token',
        headers: { 
            'Authorization': `Basic ${encodedAuthorization}`, 
            ...data.getHeaders()
        },
        data : data
    };

Basic-Auth-Authentication-Scheme函数如下:

  1. 客户端以“用户名”和“密码”的形式提供凭据。
  2. 用户名和密码用冒号连接:“用户名:密码”
  3. 连接的字符串以 base64 编码
  4. header 值就是前缀为“Basic”的 base64 编码字符串

下面你可以看到一个javascript实现:

const userName = "username"
const password = "password"

const authenticationHeader = "Basic " + btoa(`${userName}:${password}`)