我使用Node(v0.12.4)+ Express(v4.0.0)+ PassportJS(v0.1.17)来验证使用LinkedIn的用户(OAuth2)。
我按照本教程中的步骤操作: https://developer.linkedin.com/docs/oauth2
我能够对用户进行身份验证,并将他的信息以及LinkedIn提供的Auth Token保存到我的数据库中。
我的问题:如何使用令牌向API发出请求?我已经陷入了给定教程的第4步。
例如,我如何在下面进行调用(取自上面的教程)?
示例通话
GET /v1/people/~ HTTP/1.1
Host: api.linkedin.com
Connection: Keep-Alive
Authorization: Bearer AQXdSP_W41_UPs5ioT_t8HESyODB4FqbkJ8LrV_5mff4gPODzOYR
看起来很简单,但作为一个节点初学者,我一直在努力解决它。
==================
修改:
按照Ted Avery的建议,我尝试了request module
并得到了类似的结果:
// LinkedIn API route
app.get('/linkedin/people', function(req,res){
request.get('http://api.linkedin.com/v1/people/~', {
'host': 'api.linkedin.com',
'connection': 'Keep-Alive'
'auth': {
'bearer': req.user.linkedin.token
}
}, function(error,apiRes,body){
res.send(apiRes);
});
});
我得到以下回复(apiRes
):
{
"statusCode":401
"body":"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<error>\n <status>401</status>\n <timestamp>1437750879622</timestamp>\n <request-id>AKM2GX6BFE</request-id>\n <error-code>0</error-code>\n <message>ssl required</message>\n</error>\n",
"headers":{
"server":"Apache-Coyote/1.1",
"x-li-request-id":"AKM2GX6BFE",
"date":"Fri, 24 Jul 2015 15:14:38 GMT",
"vary":"*",
"x-li-format":"xml",
"content-type":"text/xml;charset=UTF-8",
"content-length":"236",
"x-li-fabric":"prod-ltx1",
"x-li-pop":"prod-ltx1",
"x-li-uuid":"zoW/s87q8xNQnsleUCsAAA==",
"set-cookie":["lidc=\"b=TB60:g=105:u=27:i=1437750879:t=1437833236:s=AQFNZrhu0_0QIvH-rUkU4ElJ8Ytm_dKV\"; Expires=Sat, 25 Jul 2015 14:07:16 GMT; domain=.linkedin.com; Path=/"]
},
"request":{
"uri":{
"protocol":"http:",
"slashes":true,
"auth":null,
"host":"api.linkedin.com",
"port":80,
"hostname":"api.linkedin.com",
"hash":null,
"search":null,
"query":null,
"pathname":"/v1/people/~",
"path":"/v1/people/~",
"href":"http://api.linkedin.com/v1/people/~"
},
"method":"GET",
"headers":{
"authorization":"Bearer AQVYLfCs5lpbUlFdGeKXdR3z-3IiuO2N-PdJ7wgEtD_2doyxcy--mUxCN-GCJm-CaRXa-j7OF646enu_V5cp8jbiuMPesqKjWLcDdMmy8PSbEXS6Mw2iVznVF0Mk0iSAm419XlB7uMFwX0iAC71a_kjk_hZmvc90PmT471MLButnQmo3ww0"
}
}
}
我知道linkedin-passport身份验证过程没问题,因为我在我的数据库中获取了用户名,电子邮件和令牌。问题是,有了这个令牌,我总是会因某种原因获得401。有什么想法?
答案 0 :(得分:1)
使用request库大大简化了Node中的任何REST,因此我建议这样做。您可以在文档中找到一些您想要的示例。对不起,我知道一个代码示例是最好的,但是因为我已经使用这个lib工作了一段时间,所以已经有一段时间了。
答案 1 :(得分:0)
您用来访问LinkedIn的护照库可能仍在请求现在允许的更多默认范围成员权限(根据2月份发生的LinkedIn api更改)。我建议您确保在设置护照呼叫时请求的范围仅限于基本的r_basicprofile
成员许可开始并从那里开始。
IIRC,默认情况下它曾经要求r_fullprofile
,一般公众不再可以使用,这会在尝试根据新的公共权限集进行身份验证时导致错误。
答案 2 :(得分:0)
我知道你很久以前就问过这个问题,但我有一个答案,可能对其他人有帮助。
将“身份验证”替换为'授权'
// LinkedIn API route
app.get('/linkedin/people', function(req,res){
request.get('http://api.linkedin.com/v1/people/~', {
'host': 'api.linkedin.com',
'connection': 'Keep-Alive'
'Authorization': { // <------- Replace this
'bearer': req.user.linkedin.token
}
}, function(error,apiRes,body){
res.send(apiRes);
});
});
您需要将 state=ThisIsRandomBlaBlaDCEeFWf45A53sdfKef424
添加为参数
当您对 https://www.linkedin.com/oauth/v2/authorization