Ven*_*eri 7 https node.js facebook-graph-api
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
Run Code Online (Sandbox Code Playgroud)
尝试连接时,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();
Run Code Online (Sandbox Code Playgroud)
错误是:
{ code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect' }
Run Code Online (Sandbox Code Playgroud)
该调用与wget/curl一起工作正常,因此它不是传出防火墙规则等问题.节点请求有什么问题?
Ven*_*eri 10
原来问题是https证书验证失败.来自节点的https.request()文档:
rejectUnauthorized:如果为true,则根据提供的CA列表验证服务器证书.如果验证失败,则会发出"错误"事件.在发送HTTP请求之前,验证发生在连接级别.默认为true.
除非明确提供,否则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();
Run Code Online (Sandbox Code Playgroud)