javascript - 如何实际使用使用discord oauth2请求的数据

标签 javascript express oauth-2.0 discord discord.js

我不确定如何使用/访问不一致的oauth2身份验证请求的数据。我已请求访问用户所在的行会以及用户名和头像。我获得了成功的身份验证,但是我的问题是如何使用和访问该数据?这是我目前的代码:

server.js

const express = require('express');
const path = require('path');

const app = express();

app.use('/static', express.static(path.join(__dirname, 'static')));

app.get('/', (req, res) => {
  res.status(200).sendFile(path.join(__dirname, 'index.html'));
});

app.listen(50451, () => {
  console.info('Running on port 50451');
});

app.use('/api/discord', require('./api/discord'));

app.use((err, req, res, next) => {
  switch (err.message) {
    case 'NoCodeProvided':
      return res.status(400).send({
        status: 'ERROR',
        error: err.message,
      });
    default:
      return res.status(500).send({
        status: 'ERROR',
        error: err.message,
      });
  }
});

discord.js
const express = require('express');
const dotenv = require('dotenv').config()
const fetch = require('node-fetch');
const btoa = require('btoa');
const { catchAsync } = require('../utils');

const router = express.Router();
const scopes = ['identify', 'guilds'];

const CLIENT_ID = process.env.CLIENT_ID;
const CLIENT_SECRET = process.env.CLIENT_SECRET;
const redirect =       
encodeURIComponent('http://localhost:50451/api/discord/callback');

router.get('/login', (req, res) => {
  res.redirect(`https://discordapp.com/api/oauth2/authorize?client_id=${CLIENT_ID}&redirect_uri=${redirect}&response_type=code&scope=identify%20guilds`);
});

router.get('/callback', catchAsync(async (req, res) => {
  if (!req.query.code) throw new Error('NoCodeProvided');
  const code = req.query.code;
  const creds = btoa(`${CLIENT_ID}:${CLIENT_SECRET}`);
  const response = await fetch(`https://discordapp.com/api/oauth2/token?grant_type=authorization_code&code=${code}&redirect_uri=${redirect}`,
    {
  method: 'POST',
  headers: {
    Authorization: `Basic ${creds}`,
  },
});
  const json = await response.json();
  res.redirect(`/success/?token=${json.access_token}`);
}));

module.exports = router;

任何帮助将不胜感激。谢谢!

最佳答案

几乎与您使用req.query.code获取access_token的方式相同。

const fetchDiscordUserInfo = await fetch('http://discordapp.com/api/users/@me', {
  headers: {
    Authorization: `Bearer ${json.access_token}`,
  }
});
const userInfo = await fetchDiscordUserInfo.json();

yourUserId = `${userInfo.id}`;
yourUserName = `${userInfo.username}`;

// or simply...
console.log(userInfo);

关于javascript - 如何实际使用使用discord oauth2请求的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54387939/

相关文章:

node.js - req.params.number 是 expressjs 中的字符串?

javascript - 将 req 数据传递到 Q Promise

javascript - 如何使用 Express.JS 接收多个请求

java - 当java中的响应代码为4xx时,如何解析REST API的响应正文

node.js - 用户通过oauth2 twitter 授权或通过 Passport discord 授权后如何重定向到React/Vue 路由?

javascript - 当所选文本位于 iframe 中时,content.getSelection() 不起作用?

javascript - 将 highcharts 数据导出到 CSV 文件

oauth-2.0 - 具有复杂或细粒度范围的 OAuth 2.0

javascript - 导致页面无法加载的变量声明?

javascript - 在 .load() 上获取图像宽度不适用于除 Firefox 之外的所有浏览器