收到来自 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_tokenPOST 请求中,以交换在响应中以 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 使第一个 GEThttps://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.htmlng-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