【问题标题】:How to send github OAuth data to client?如何将 github OAuth 数据发送给客户端?
【发布时间】: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


    【解决方案1】:

    HTTP 使用一个循环,每个请求需要一个响应。当客户端发送请求时,服务器应该只向客户端发送一个响应。

    您为一个请求发送两个响应res.sendFile()res.send(),因此您的代码需要更改如下,

    app.get('/', (req, res, next) => {
        if (req.session.access_token) {
            request.get({
                url: 'https://api.github.com/user',
                headers: { Authorization: 'token ' + req.session.access_token, 'User-Agent': 'Login-App' }
            }, (error, response, body) => { res.send(body); }
            );
        } else {
            res.sendFile(__dirname + '/index.html');
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 2022-01-09
      相关资源
      最近更新 更多