【问题标题】:JS How to get discord account data via oauth2JS如何通过oauth2获取不和谐账户数据
【发布时间】:2021-10-19 14:42:02
【问题描述】:

我正在为不和谐开发一个审核机器人,我正在尝试创建一个付费计划,因此我需要用户使用他们的不和谐帐户登录 oauth2,以便我可以获取用户数据并知道哪个服务器有付费计划,下巴。所以现在我刚刚创建了一个 oauth2 url 并为 https://bouncerbot.goatcode.it/index.html 设置了重定向

然后,在用户登录后,我有这个 url:https://bouncerbot.goatcode.it/index.html?code=nZauBH6wT0hxn8g8SsS1OwiDvN35nn&guild_id=872213710150713384&permissions=0 所以现在我想要用户数据(个人资料图片、用户名等)我怎样才能得到它?

【问题讨论】:

    标签: javascript json oauth-2.0 discord


    【解决方案1】:

    我有一个类似的文件,你可以查找。

    import { CLIENT_ID, CLINET_SECRET, AUTHORIZATION_URL, REDIRECT_URL } from '../config/keys';
    import React, { useEffect } from 'react';
    import axios from 'axios';
    
    const Auth = (props) => {
        const getUserGuilds = async (accessToken) => {
            // console.log(`Guild ${accessToken.data.token_type} ${accessToken.data.access_token}`);
            try {
                const response = await axios.get('https://discord.com/api/users/@me/guilds', {
                    headers: {
                        authorization: `${accessToken.data.token_type} ${accessToken.data.access_token}`
                    }
                });
                // console.log(response.data);
                return response.data;
            } catch (error) {
                console.log(error);
            }
        }
        const getUserInfo = async (accessToken) => {
            // console.log(accessToken);
            // console.log(`User ${accessToken.data.token_type} ${accessToken.data.access_token}`);
            try {
                const response = await axios.get('https://discord.com/api/users/@me', {
                    headers: {
                        authorization: `${accessToken.data.token_type} ${accessToken.data.access_token}`
                    }
                });
                // console.log(response.data);
                return response.data;
            } catch (error) {
                console.log(error);
            }
        }
        const getToken = async (code) => {
            try {
                const options = new URLSearchParams({
                    client_id: CLIENT_ID,
                    client_secret: CLINET_SECRET,
                    code,
                    grant_type: 'authorization_code',
                    redirect_uri: REDIRECT_URL,
                    scope: 'identify guilds',
                });
                const result = await axios.post('https://discord.com/api/oauth2/token', options);
                return result;
            } catch (error) {
                console.log(error);
            }
        }
    
        const getInfo = async (code) => {
            const accessToken = await getToken(code);
            const userInfo = await getUserInfo(accessToken);
            const guildInfo = await getUserGuilds(accessToken);
            console.log({ userInfo, guildInfo });
        }
    
        useEffect(() => {
    
            const urlSearchParams = new URLSearchParams(window.location.search);
            const params = Object.fromEntries(urlSearchParams.entries());
            // console.log(params);
            if (!params.code) return;
            getInfo(params.code);
        });
        return (
            <div className="Auth">
                <br />
                <a className="btn" href={AUTHORIZATION_URL} >Login with discord</a>
            </div>
        )
    }
    
    export default Auth;
    
    

    【讨论】:

      【解决方案2】:

      抱歉拖了一段时间,你可以用这个:

        done(null, user);
        });
        passport.deserializeUser((obj, done) => {
        done(null, obj);
        });
        
        passport.use(new Strategy({
          clientID: "",
          clientSecret: "",
          callbackURL: "http://localhost:8000/callback",
          scope: [ "identify", "guilds" ],
        },
        (accessToken, refreshToken, profile, done) => {
        process.nextTick(() => done(null, profile));
        }));
        
        app.use(session({
        secret: '123',
        resave: false,
        saveUninitialized: false,
        }));
        
        app.use(passport.initialize());
        app.use(passport.session());
        app.use(helmet());
        
        app.locals.domain = process.env.PROJECT_DOMAIN;
      
      
      app.engine('.ejs', ejs.__express);
      app.set('views',__dirname+'/views');
      app.use(express.static("public"));
      
      var bodyParser = require("body-parser");
      app.use(bodyParser.json());
      app.use(bodyParser.urlencoded({ 
      extended: true
      })); 
      
      function checkAuth(req, res, next) {
      if (req.isAuthenticated()) return next();
      req.session.backURL = req.url;
      res.redirect("/giris");
      }
      
      const renderTemplate = (res, req, template, data = {}) => {
      const baseData = {
      bot: client,
      path: req.path,
      user: req.isAuthenticated() ? req.user : null
      };
      res.render(path.resolve(`${templateDir}${path.sep}${template}`), Object.assign(baseData, data));
      };
      
      app.get("/giris", (req, res, next) => {
      if (req.session.backURL) {
      req.session.backURL = req.session.backURL;
      } else if (req.headers.referer) {
      const parsed = url.parse(req.headers.referer);
      if (parsed.hostname === app.locals.domain) {
      req.session.backURL = parsed.path;
      }
      } else {
      req.session.backURL = "/";
      }
      next();
      },
      passport.authenticate("discord"));
      
      app.get("/baglanti-hatası", (req, res) => {
      renderTemplate(res, req, "autherror.ejs");
      });
      
      app.get("/callback", passport.authenticate("discord", { failureRedirect: "/autherror" }), async (req, res) => {
      if (req.session.backURL) {
      const url = req.session.backURL;
      req.session.backURL = null;
      res.redirect(url);
      } else {
      res.redirect("/");
      }
      });
      
      app.get("/cikis", function(req, res) {
      req.session.destroy(() => {
      req.logout();
      res.redirect("/");
      });
      });```
      
      You fill in the clientID, clientSecret, callbackURL sections. When the user logs in, it is sufficient to specify the id of any page.
      
      

      【讨论】:

        【解决方案3】:

        这绝对是一个 Oauth2 问题,而不是 Discord 问题。此答案将使用使用 node-fetch 库的 JS 示例发出 Web 请求,并假设您使用的是 express 后端。

        首先,您希望用户使用您的客户 ID 和 the identify scope 授权他们的帐户。当他们点击授权时,他们将被发送到您指定的重定向 URI(本例中为https://example.com/redirect)。

        当他们被重定向时,他们登陆的 URL 上会有一个 code GET 参数,您应该将其发送到 Discord's token URL 以获取访问令牌:

        app.get('/redirect', async function (req, res) {
            // Check their GET params to get the code
            var code = req.query.code;
        
            // Make our POST body
            var body = {
                'client_id': CLIENT_ID,
                'client_secret': CLIENT_SECRET,
                'grant_type': 'authorization_code',
                'code': code,
                'redirect_uri': 'https://example.com/redirect',
            };
        
            // POST that to Discord
            var site = await fetch("https://discord.com/api/v9/oauth2/token", {
                method: 'POST',
                body: JSON.stringify(body),
                headers: {'Content-Type': 'application/x-www-form-urlencoded'},
            });
        
            // And parse the response
            var response = await site.json();
            var accessToken = response['access_token'];
            res.send(`Access token: ${accessToken}`);
        })
        

        使用 Discord 响应中给出的访问令牌,您可以使用 Authorization 标头 Bearer XXXXX(其中 XXXXX 是您的访问令牌)向 get the current user 发出 GET 请求:

        var site = await fetch("https://discord.com/api/v9/users/@me", {
            method: 'GET',
            headers: {'Authorization': `Bearer ${accessToken}`}
        });
        var response = await site.json();
        var username = response.username;
        

        如果不知道您正在使用哪些库的更多信息,我无法具体说明您需要这些东西,但这是一个不错的示例列表,以及您需要通过哪些流程来获取您需要的信息想要。

        【讨论】:

        • 不知道如何获取访问令牌
        • 从重定向中获取code=XXXXX,您需要使用该令牌、您的客户端 ID 和密码、您的范围以及您的重定向 URI 向 Discord 发出 POST 请求。文档在 Python 中给出了一个示例:discord.com/developers/docs/topics/…
        • 你能给我一个javascript的例子吗?
        • 我已更新我的答案以包含使用 node-fetchexpress 的示例。
        • 我尝试使用您的代码,但出现此错误:未定义应用程序
        【解决方案4】:

        据我了解,我很可能想要制作一个登录系统,而您想要不和谐地做到这一点,您可以查看此资源。 https://www.youtube.com/watch?v=tSS8VKwwjp0

        【讨论】:

        • 我正在寻找类似的东西,但在视频中没有解释如何获取登录用户的数据,此外他使用我不知道如何使用的 EJS
        • 啊,我对这方面了解不多,建议你看看一些现成的基础设施。
        • 没错,这就是我正在尝试做的,但我在网上找不到太多,而且不和谐的文档做得不好
        • 是的,您是对的,没有适当的文档或示例。如果我能找到一些可以为你做一些研究的东西,我会尽快回复你。
        猜你喜欢
        • 2020-10-09
        • 2018-08-12
        • 1970-01-01
        • 1970-01-01
        • 2020-10-31
        • 2018-04-24
        • 1970-01-01
        • 2020-08-27
        • 2021-04-02
        相关资源
        最近更新 更多