要使用Instagram API对应用中的用户进行身份验证,请将用户重定向到网址https://api.instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=code
。
用户登录此页面后,Instagram会对重定向URI(上述网址中的GET
)发出REDIRECT-URI
个请求。对重定向URI的此调用包含一个代码,您必须将该代码包含在POST
https://api.instagram.com/oauth/access_token
请求中,以交换在响应中以JSON
形式发送的访问令牌。 / p>
所以我接收了重定向调用并使用我的Express API发出了访问令牌的请求,这很好用,我得到了带有访问令牌的表单。
app.get('/redirect', function(req, res){
if(req.query.error){
console.log('Error authenticating user');
console.log(req.query.error);
}
else{
request.post(
'https://api.instagram.com/oauth/access_token',
{form:{
client_id: 'my_client_id',
client_secret: 'my_client_secret',
grant_type: 'authorization_code',
redirect_uri: 'http://localhost/redirect',
code: req.query.code
}
},
function(error, response, body){
if(!error && response.statusCode == 200){
console.log(body);
//HOW DO I GET THIS RESPONSE TO ANGULAR?
res.json({
access_token: body.access_token,
full_name: body.full_name,
username: body.username,
profile_picture: body.profile_picture,
id: body.id
});
return;
}
else{
console.log(response);
console.log(body);
}
}
);
};
我的问题是:如何将访问令牌(或错误响应)发送回Angular?
换句话说,Angular如何从它未发出的请求中收到响应(因为我想收到的响应来自NodeJS request
的请求)?
最初我尝试使用Angular创建第一个GET
到https://api.instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=code
,但我不认为可以这样做,因为应该将用户定向到Instagram URL进行登录。< / p>
更新
当Instagram发布GET /redirect?code=xxxxxx
时,它会将请求发送到我的API,但也会将页面网址更改为http://localhost/redirect?code=xxxxxx
。我可以在我的API中接收访问令牌并将其发送到我的客户端,但由于上述网址,该页面仅显示为响应的文本,而不是index.html
ng-view
。在这种情况下,如何让页面成为我的index.html
?
我尝试过使用angular-router以下方法,但都没有奏效:
.when('/redirect', {
templateUrl: 'views/success.html',
controller: 'Controller'
})
和
.when('/success', {
templateUrl: 'views/success.html',
controller: 'Controller'
})
.when('/redirect', {
redirectTo: '/success'
})
答案 0 :(得分:1)
我最终做了什么(而且我不确定这是最优的):
收到Node发出的回复后,我将响应中的访问令牌body.access_token
存储在req.session.user
express-session
提供的npm
对象中} package然后我使用res.redirect('/#/home');
将用户重定向到主页。
app.get('/redirect', function(req, res){
if(req.query.error){
console.log('Error authenticating user');
console.log(req.query.error);
}
else{
request.post(
'https://api.instagram.com/oauth/access_token',
{form:{
client_id: 'my_client_id',
client_secret: 'my_client_secret',
grant_type: 'authorization_code',
redirect_uri: 'http://localhost/redirect',
code: req.query.code
}
},
function(error, response, body){
if(!error && response.statusCode == 200){
console.log('Success making POST to Insta API for token, making new session object');
console.log('token:', (JSON.parse(body).access_token), '\n');
req.session.user = {};
req.session.user.token = JSON.parse(body).access_token;
req.session.save();
res.redirect('/#/home');
}
else{
console.log(error);
res.redirect('/#/login');
}
}
);
};
这样,Angular在将用户重定向到Instagram的授权页面后不需要接收访问令牌,因为访问令牌保存在req.session.user
对象中,然后可以访问该对象。会议期间的后端。
然后,您可以在后端对Instagram API的任何请求中使用访问令牌(通过从Angular调用您的API启动),例如:通过将它连接到您的Instagram API调用的端点,如下所示:
var endpoint = 'https://api.instagram.com/v1/users/self/follows?access_token=' + req.session.user.token;
此方法也适用于express-session
的会话管理功能,因为会话仅在用户可以通过Instagram进行身份验证时创建。有关如何将会话管理集成到您的应用中的快速教程,请参阅here。