收到来自 Instagram API 调用 AngularJS 的回复
Receive response from Instagram API call with AngularJS
要在使用 Instagram API 的应用程序中对用户进行身份验证,您需要将用户重定向到 URL https://api.instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=code
。
一旦用户在此页面上登录,Instagram 就会向重定向 URI 发出 GET
请求(上面 URL 中的 REDIRECT-URI
)。此对重定向 URI 的调用包含一个代码,然后您必须将该代码包含在对 https://api.instagram.com/oauth/access_token
的 POST
请求中,以交换在响应中以 JSON
形式发送的访问令牌。
所以我正在接收重定向调用并使用我的 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 登录。
更新:
当 Instagram 创建 GET /redirect?code=xxxxxx
时,它会向我的 API 发送请求,但也会将页面 URL 更改为 http://localhost/redirect?code=xxxxxx
。我可以在我的 API 中接收访问令牌并将其发送到我的客户端,但是由于上述 URL,该页面仅显示为响应文本而不是我的 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'
})
我最终做了什么(我不确定这是最优的):
收到 Node 调用的响应后,我将响应中的访问令牌 body.access_token
存储在 express-session
[=] 提供的 req.session.user
对象中14=] 包,然后我使用 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。
要在使用 Instagram API 的应用程序中对用户进行身份验证,您需要将用户重定向到 URL https://api.instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=code
。
一旦用户在此页面上登录,Instagram 就会向重定向 URI 发出 GET
请求(上面 URL 中的 REDIRECT-URI
)。此对重定向 URI 的调用包含一个代码,然后您必须将该代码包含在对 https://api.instagram.com/oauth/access_token
的 POST
请求中,以交换在响应中以 JSON
形式发送的访问令牌。
所以我正在接收重定向调用并使用我的 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 登录。
更新:
当 Instagram 创建 GET /redirect?code=xxxxxx
时,它会向我的 API 发送请求,但也会将页面 URL 更改为 http://localhost/redirect?code=xxxxxx
。我可以在我的 API 中接收访问令牌并将其发送到我的客户端,但是由于上述 URL,该页面仅显示为响应文本而不是我的 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'
})
我最终做了什么(我不确定这是最优的):
收到 Node 调用的响应后,我将响应中的访问令牌 body.access_token
存储在 express-session
[=] 提供的 req.session.user
对象中14=] 包,然后我使用 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。