如何使用 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的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Express 和 NGINX 设置路由?

如何正确配置 Next.js 作为前端和 Express 应用作为后端?

我们如何使用 Mycrosoft Sync Framework 2.0 推迟将 SQL Express DB 作为客户端和 SQL Server 作为服务器的冲突解决

如何在 express 和 bodyParser 中接受 application/csp-report 作为 json?

带有代理和排除的 html5 pushstate 的 Apache 重写规则

如何设置 Node/Express 作为 STUN 服务器? [关闭]