OAuth舞蹈的一个步骤涉及交换通过回调接收的访问令牌代码。特别是对于Facebook服务器端身份验证,以下https GET请求返回响应正文中的访问代码:
https://graph.facebook.com/oauth/access_token?
client_id=YOUR_APP_ID
&redirect_uri=YOUR_REDIRECT_URI
&client_secret=YOUR_APP_SECRET
&code=CODE_GENERATED_BY_FACEBOOK
尝试连接时,Node.js会触发错误:
https.get( /**String | Object*/ options, function ( res ) {
res.setEncoding( 'utf8' );
res.on( 'data', function ( data ) {
// parse response body
} );
} ).on( 'error',function ( e ) {
Log.w( TAG, "Error requesting access_token", e );
} ).end();
错误是:
{ code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect' }
这个调用与wget / curl一起工作正常,所以它不是传出防火墙规则等问题。节点请求有什么问题?
答案 0 :(得分:10)
原来问题是https证书验证失败。来自节点的https.request()docs:
rejectUnauthorized :如果为true,则根据提供的CA列表验证服务器证书。如果验证失败,则会发出“错误”事件。在发送HTTP请求之前,验证发生在连接级别。默认为真。
除非明确提供,否则http [s]。[request | get]将使用忽略tls.connect()选项的全局代理,包括 rejectUnauthorized 标志。因此需要修改对get(或request)的调用:
var options = require('url').parse( /**String*/ url );
options.rejectUnauthorized = false;
options.agent = new https.Agent( options );
https.get( /**Object*/ options, function ( res ) {
// handle response & body
} ).on( 'error',function ( e ) {
// handle errors
} ).end();