如何使用 express 作为代理和 xhr 作为客户端通过客户端身份验证联系 twitter api
Posted
技术标签:
【中文标题】如何使用 express 作为代理和 xhr 作为客户端通过客户端身份验证联系 twitter api【英文标题】:How to contact twitter api with client authentication using express as proxy and xhr as client 【发布时间】:2017-04-16 07:31:29 【问题描述】:请求
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function()
if (this.readyState == 4 && this.status == 200)
console.log(this.response);
console.log(this.responseText);
;
xhttp.open("GET", "http://localhost:4000/auth/test", true);
xhttp.withCredentials = true;
xhttp.send();
server.js
var express = require('express')
var app = express()
app.get('/auth/test', function (req, res)
console.log("hitting /auth/test");
res.json( text: "hello world" );
);
// var cors = require('cors');
// app.use(cors());
app.use(function(req, res, next)
// Set CORS headers
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Request-Method', '*');
res.setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET');
res.setHeader('Access-Control-Allow-Headers', '*');
if ( req.method === 'OPTIONS' )
res.writeHead(200);
res.end();
return;
next();
);
app.listen(4000, function ()
console.log('Example app listening on port 4000!')
);
错误:
dashboard:1 XMLHttpRequest cannot load http://localhost:4000/auth/test. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access.
我无法使用代理访问我的服务器,我的客户端是 github 上 react-boilerplate 的一个分支,加载不支持代理。
【问题讨论】:
【参考方案1】:这可以很好地代理对 twitter api 1.1 的请求。
var express = require('express');
var app = express();
var cors = require('cors');
app.use(cors());
var request = require('request');
var ClientOAuth2 = require('client-oauth2');
const twitterAuth = new ClientOAuth2(
clientId: '***',
clientSecret: '***',
accessTokenUri: 'https://api.twitter.com/oauth2/token',
authorizationUri: 'https://api.twitter.com/oauth/authorize',
authorizationGrants: ['credentials'],
redirectUri: 'http://www.domain.com/cb',
);
app.get('/auth/twitter', function (req, res)
twitterAuth.credentials.getToken()
.then(function (user)
res.json(user.data);
);
);
app.use('/search/twitter/:search', function (req, res)
var search = req.params.search;
// You need to attach the bearer in Authorization header, it will be reused by our proxy.
var bearer = req.headers.Authorization;
console.log('search', search);
console.log('bearer', bearer);
var url = 'https://api.twitter.com/1.1/search/tweets.json?q=' + search;
var options =
url: 'https://api.twitter.com/1.1/search/tweets.json?q=' + search,
headers:
'Authorization': bearer,
'Accept-Encoding': 'gzip'
;
req.pipe(request(options)).pipe(res);
);
app.listen(4000, function ()
console.log('Example app listening on port 4000!')
);
【讨论】:
以上是关于如何使用 express 作为代理和 xhr 作为客户端通过客户端身份验证联系 twitter api的主要内容,如果未能解决你的问题,请参考以下文章
如何正确配置 Next.js 作为前端和 Express 应用作为后端?
我们如何使用 Mycrosoft Sync Framework 2.0 推迟将 SQL Express DB 作为客户端和 SQL Server 作为服务器的冲突解决
如何在 express 和 bodyParser 中接受 application/csp-report 作为 json?