401 未经授权的请求与 OAuth 不一致 API

401 Unauthorized Request Discord API with OAuth

我想让使用 Discord 的我网站的用户能够“自动”加入我的 guild

除了我总是使用以下方法从 Discord's API 得到 401: Unauthorized 之外,我什么都做完了;

router.get("/cb", passport.authenticate("discord", { failureRedirect: "/" }), async function(req, res) {
    const data = { access_token: req.user.accessToken };
    axios.put(`https://discordapp.com/api/v8/guilds/${config.CyberCDN.server_id}/members/${req.user.id}`, {
        headers: {
            "Content-Type": "application/json",
            "Authorization": `Bot ${config.CyberCDN.bot_token}`
        },
        body: JSON.stringify(data)
    }).then((success) => {
        console.log(`[DASHBOARD] ${req.user.username}#${req.user.discriminator} - Logging in...`);
        console.log(success.config.data)
        console.log(success.response.status)
        return res.status(200).redirect("/");
    }).catch((error) => {
        console.log(`[DASHBOARD] ${req.user.username}#${req.user.discriminator} - Failed Logging in...`);
        console.log(error.config.data.replace(config.CyberCDN.bot_token,"TOKEN"))
        console.log(error.response.status)
        return res.status(403).redirect("/");
    });
});

我不明白为什么我所做的一切都是正确的;

我什至在 Discord-API 服务器中询问过关于此事的相同问题,

不过我确实让它工作了ONE TIME,现在它又坏了,我不知道它是怎么坏的。

我的范围如下"oauth_scopes": ["guilds.join"]

我找到了解决这个问题的更好方法:

const DiscordOauth2 = require("discord-oauth2");
const discord = new DiscordOauth2();

/** 
 * Other required stuff for express.js goes here...
 */

router.get("/login", passport.authenticate("discord"));

router.get("/cb", passport.authenticate("discord", { failureRedirect: "/forbidden" }), async function(req, res) {
    req.session.user = req.user;
    res.redirect('/');
});

router.get("/support", authOnly, async function(req, res) {
     discord.addMember({
        accessToken: req.session.user.accessToken,
        botToken: config.CyberCDN.bot_token,
        guildId: config.CyberCDN.server_id,
        userId: req.session.user.id,
        roles: [config.CyberCDN.site_role]
    }).then((r) => {
        if(r) {
          let date = new Date(r.joined_at);
          res.status(200).json({ status: "Joined Server" });
          const embed = new Embed()
              .title(`New User Joined Via Site\n${r.user.username}#${r.user.discriminator}`)
              .colour(16763904)
              .thumbnail(`https://cdn.discordapp.com/avatars/${r.user.id}/${r.user.avatar}.webp?size=128`)
              .footer(`User joined at: ${date.toLocaleDateString()}`)
              .timestamp();
          dhooker.send(embed);
          console.log(r)
        }else{
          res.status(401).json({ status: "Already In There?" });
        }
    });
});

基本上通过浏览我最初的 401: Unauthorized 错误偶然发现了一个不错的小 OAuth2 NPM For Discord,名为 discord-oauth2,由 reboxer 和许多其他人开发,可以是找到 here.

与我的问题相关的有用部分在该回购协议的 README.md 下方进一步记录。 Relation found here

我还贡献了他们也添加了 removeMember 功能。