【问题标题】:Receive response from Instagram API call with AngularJS使用 AngularJS 接收来自 Instagram API 调用的响应
【发布时间】:2016-09-05 06:18:07
【问题描述】:

要使用 Instagram API 对应用中的用户进行身份验证,请将用户重定向到 URL https://api.instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=code。

一旦用户在此页面上登录,Instagram 就会向重定向 URI(上述 URL 中的 REDIRECT-URI)发出 GET 请求。此对重定向 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'
                        })

【问题讨论】:

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


    【解决方案1】:

    我最终做了什么(我不确定这是不是最佳):

    收到来自 Node 的调用的响应后,我将来自响应 body.access_token 的访问令牌存储在 express-session npm 包提供的 req.session.user 对象中,然后重定向用户到主页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。

    【讨论】:

      猜你喜欢
      • 2020-09-16
      • 1970-01-01
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      相关资源
      最近更新 更多