我正在使用passport-twitter的nodejs模块测试twitter auth。我已经创建了我的Twitter应用程序,并配置了所有内容,如教程所指定的。问题是我是一个公司代理,据我所知,node没有任何全局代理配置,也不尊重系统代理配置。这是我尝试使用twitter-passport进行身份验证时获得的输出:
InternalOAuthError:无法获取请求令牌 在Strategy.OAuthStrategy._createOAuthError(/home/droid/WebstormProjects/passport-social-master/node_modules/passport-oauth1/lib/strategy.js:390:13) at /home/droid/WebstormProjects/passport-social-master/node_modules/passport-oauth1/lib/strategy.js:244:40 at /home/droid/WebstormProjects/passport-social-master/node_modules/oauth/lib/oauth.js:543:17 在ClientRequest。 (/home/droid/WebstormProjects/passport-social-master/node_modules/oauth/lib/oauth.js:421:9) 在emitOne(events.js:77:13) 在ClientRequest.emit(events.js:169:7) 在TLSSocket.socketErrorListener(_http_client.js:265:9) 在emitOne(events.js:77:13) 在TLSSocket.emit(events.js:169:7) 在connectErrorNT(net.js:996:8) at doNTCallback2(node.js:452:9) at process._tickCallback(node.js:366:17)
到目前为止,我已尝试使用此设置全局隧道:
var globalTunnel = require('global-tunnel');
globalTunnel.initialize({
host: 'proxy.example.com',
port: 8080
});
在这种情况下,我得到的就是这条消息:
TypeError:请求路径包含未转义的字符。 在新的ClientRequest(_http_client.js:54:11) 在exports.request(http.js:31:10) 在TunnelingAgent.http.request(/home/droid/WebstormProjects/passport-social-master/http-proxy.js:36:15) 在TunnelingAgent.createSocket(/home/droid/WebstormProjects/passport-social-master/node_modules/tunnel/lib/tunnel.js:116:25) 在TunnelingAgent.createSecureSocket [as createSocket](/home/droid/WebstormProjects/passport-social-master/node_modules/tunnel/lib/tunnel.js:188:41) 在TunnelingAgent.addRequest(/home/droid/WebstormProjects/passport-social-master/node_modules/tunnel/lib/tunnel.js:80:8) 在新的ClientRequest(_http_client.js:139:16) 在exports.request(http.js:31:10) at Object.http.request(/home/droid/WebstormProjects/passport-social-master/http-proxy.js:36:15) at Object.globalTunnel._defaultedAgentRequest(/home/droid/WebstormProjects/passport-social-master/node_modules/global-tunnel/index.js:211:38) at Object.exports.request(https.js:173:15) at Object.globalTunnel._defaultedAgentRequest(/home/droid/WebstormProjects/passport-social-master/node_modules/global-tunnel/index.js:211:38) at exports.OAuth._createClient(/home/droid/WebstormProjects/passport-social-master/node_modules/oauth/lib/oauth.js:256:20) at exports.OAuth._performSecureRequest(/home/droid/WebstormProjects/passport-social-master/node_modules/oauth/lib/oauth.js:371:19) at exports.OAuth.getOAuthRequestToken(/home/droid/WebstormProjects/passport-social-master/node_modules/oauth/lib/oauth.js:542:8) 在Strategy.OAuthStrategy.authenticate(/home/droid/WebstormProjects/passport-social-master/node_modules/passport-oauth1/lib/strategy.js:242:21)
我也试过Shaun Xu的半全局代理(http://blog.shaunxu.me/archive/2013/09/05/semi-global-proxy-setting-for-node.js.aspx)。我在任何地方都导入了修改过的require.js,但没有任何工作。所以我没有选择......
答案 0 :(得分:1)
您的问题:
全球隧道中的旧依赖。见global-tunnel Issue #13
快速解决方案:将节点隧道依赖关系更新为0.0.4似乎最终无法正常工作,因为使用它会将所有请求重定向到Internet代理,而不仅仅是身份验证请求。
这是一个'旧'的帖子,但如果有人有类似的问题:
用例:
问题:
解决方案无效:
设置系统env HTTP_PROXY或HTTPS_PROXY 不起作用有两个原因:
使用全局代理(全局隧道或类似代理)将失败,因为它们会重定向添加自己的代理(request.options.agent)的所有请求,从而将所有流量转发到您的代理。不希望。
解决方案:
使用与global-tunnel类似的代码,添加白名单仅代理某些主机名。
我已成功实施并测试了此解决方案:请参阅https://github.com/bloublou2014/httpx-proxy-agent-config
用法示例:
var proxy = require('httpx-proxy-agent-config');
proxy.install({
http_proxy: 'http://yourProxy:3128',
https_proxy: 'http://yourHttpsProxy:3218',
// example for passportjs Google OAuth2 + Google+
whitelist: ['www.google.com','accounts.google.com', '173.194.66.95', '74.125.192.95', '209.85.201.95', 'www.googleapis.com']
});
// try to access a page via http request :
var http = require('http');
http.get('http://www.google.com', function (response) {
var body = '';
response.on('data', function (d) {
body += d;
});
response.on('end', function () {
console.log("Body=", body);
});
});
// try to access a page via https request
var https = require('https');
https.get('https://www.google.com', function (response) {
var body = '';
response.on('data', function (d) {
body += d;
});
response.on('end', function () {
console.log("Body=", body);
});
});