【发布时间】:2019-06-30 23:14:18
【问题描述】:
我需要实现一个 github 授权,然后将接收到的数据 (JSON) 发送到客户端。
我找到了这个教程http://shiya.io/how-to-do-3-legged-oauth-with-github-a-general-guide-by-example-with-node-js/
在那篇教程中,开发人员向我们展示了这种方式:“/” -> “/login” -> “/redirect” -> “/user”(此处的数据)
但我需要:"/" -> "/login" -> "/redirect" -> "/"(此处的数据)
因为客户端应该使用简单的 SPA(react)。
我现在拥有的:
需要('dotenv').config(); 常量表达 = 要求(“表达”); 常量应用程序 = 快递(); const session = require('express-session'); const request = require('request'); const qs = require('querystring'); 常量 url = 要求('url'); const randomString = require('randomstring'); 常量 csrfString = randomString.generate(); 常量端口 = process.env.PORT || 8080; const redirect_uri = process.env.HOST + '/redirect'; app.use(express.static('views')); 应用程序使用( 会议({ 秘密:randomString.generate(), 饼干:{最大年龄:60000}, 重新保存:假, 保存未初始化:假 }) ); app.get('/', (req, res, next) => { res.sendFile(__dirname + '/index.html'); 如果(req.session.access_token){ 请求.get( { url: 'https://api.github.com/user', 标题:{ 授权:'token' + req.session.access_token, '用户代理':'登录应用程序' } }, (错误,响应,正文)=> { res.send(正文); } ); } }); app.listen(端口,()=> { console.log('服务器监听端口' + 端口); }); app.get('/login', (req, res, next) => { req.session.csrf_string = randomString.generate(); 常量 githubAuthUrl = 'https://github.com/login/oauth/authorize?' + qs.stringify({ client_id:process.env.CLIENT_ID, 重定向URI:重定向URI, 状态:req.session.csrf_string, 范围:'用户:电子邮件' }); res.redirect(githubAuthUrl); }); app.all('/redirect', (req, res) => { console.log('GitHub 发送的请求:'); 控制台.log(req.query); 常量代码 = req.query.code; 常量返回状态 = req.query.state; if (req.session.csrf_string === returnedState) { 请求.post( { 网址: 'https://github.com/login/oauth/access_token?' + qs.stringify({ client_id:process.env.CLIENT_ID, client_secret:process.env.CLIENT_SECRET, 代码:代码, 重定向URI:重定向URI, 状态:req.session.csrf_string }) }, (错误,响应,正文)=> { console.log('你的访问令牌:'); console.log(qs.parse(body)); req.session.access_token = qs.parse(body).access_token; res.redirect('/'); } ); } 别的 { res.redirect('/'); } 控制台.log(redirect_uri); });此时 res.send(body);报错
app.get('/', (req, res, next) => { res.sendFile(__dirname + '/index.html'); 如果(req.session.access_token){ 请求.get( { url: 'https://api.github.com/user', 标题:{ 授权:'token' + req.session.access_token, '用户代理':'登录应用程序' } }, (错误,响应,正文)=> { res.send(正文); } ); } });错误:
抛出新的 ERR_HTTP_HEADERS_SENT('set'); ^ 错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头这是因为我试图在渲染后设置数据以进行渲染。
所以,我的问题:
我如何向客户端发送数据以及如何在客户端获取数据?
【问题讨论】:
标签: javascript node.js api express github-api