通过AngularJS接收来自Instagram API调用的响应

时间:2016-08-22 21:17:54

标签: angularjs node.js http express instagram-api

要使用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创建第一个GEThttps://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'
                        })

1 个答案:

答案 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