如何实际使用使用不和谐 oauth2 请求的数据

Posted

技术标签:

【中文标题】如何实际使用使用不和谐 oauth2 请求的数据【英文标题】:how to actually use the data requested using discord oauth2 【发布时间】:2019-06-20 15:01:37 【问题描述】:

我不确定如何使用/访问从不和谐 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;

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

【问题讨论】:

【参考方案1】:

这与你使用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);

【讨论】:

以上是关于如何实际使用使用不和谐 oauth2 请求的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何获取不和谐 oauth2 隐式授权的范围值?

有没有办法使用不和谐 API 中的机器人令牌获取机器人数据?

Laravel 使用 oauth2 申请表格 - 概念问题

Cors 阻止不和谐 oauth2 登录

GitHub页面的不和谐Oauth2?

错误 redirect_uri:“不是格式正确的 URL。”在不和谐的 OAuth2 中