我正在尝试使用angularjs和通行证从Twitter获取信息。

我已经使用护照js通过OAuth进行了身份验证-效果很好-在会话中保存了用户信息。

现在,我尝试在具有任何终结点(均为V1.1和V1)的twitter API上运行任何GET命令,但它一直在抱怨授权。

示例:在我的控制器中执行

        $http.jsonp(https://api.twitter.com/1/statuses/user_timeline.json, {

        })

给我一个错误:

        GET https://api.twitter.com/1/statuses/user_timeline.json 401 (Unauthorized)

此命令在twitter控制台中有效(并且我使用jsonp来避免跨域问题)。

我是否应该通过此GET请求手动传递任何其他标头-sa auth_token等?

还是为什么不起作用? 我应该利用已经进行身份验证才能使用API​​的事实吗? 我有红色的https://dev.twitter.com/docs/auth/authorizing-request,但并没有默默地理解。

感谢您的帮助,

===============>>#1 票数:4

我最近使用NodeJ(Passport)和AngularJs实现了类似的操作。 如果您的实现有些相似,则需要在Twitter中对用户进行身份验证,并请求用户授权您的应用程序进行访问。

我附加了nodejs路由,AngularJs拦截器和AngularJS路由的摘要,以在我的实现中实现这一点。 护照和策略在Passport中都有详细记录,因此我在此解决方案中不再赘述。 我的实验性完整实现可在https://github.com/oredi/TwitThruSeet/中的以下子文件夹中找到:

  • NodeJs路由-server / routes / routes.js
  • 护照策略-server / lib / service / passport / twitterStrategy.js
  • AngularJs路由-webclient / js / app.js
  • AngularJs拦截器-webclient / js / interceptors.js

在nodejs中,您将需要创建一个中间件来验证您的请求,如下所示

app.get('/api/twitter/timeline', isLoggedIn, function (req, res) {
    getTwitterTimeLine(req, function (err, data, response) {
        if(err) {
            res.send(err, 500);
            return;
        }
        res.send(data);
    });
});

该路由使用此中间件进行身份验证,以检查用户是否已登录到Twitter并授权了您的应用程序。

// route middleware to make sure a user is logged in
function isLoggedIn(req, res, next) {
    if (!req.isAuthenticated())
        res.send(401);
    else
        next();
}

如果请求被授权,则您可以使用令牌和秘密进行呼叫

function getTwitterTimeLine(req, callback) {
    var uri = 'https://api.twitter.com/1.1/statuses/home_timeline.json?count=';
    if(req.query.count) {
        uri += req.query.count;
    } else {
        uri += "10";
    }

    console.log(uri);
    passport._strategies.twitter._oauth._performSecureRequest(
        req.user.twitter_token,
        req.user.twitter_token_secret,
        'GET',
        uri,
        null,
        null, null, function (err, data, response) {
            var processedData;
            if(!err) {
                result = [];
                var max_id, since_id;
                var jsonData = JSON.parse(data);
                for (var i = 0; i < jsonData.length; i++) {
                    var record = jsonData[i];
                    var place_full_name = null;
                    if(record.place != undefined)
                        place_full_name = record.place.full_name;
                    result.push({
                        id_str: record.id_str,
                        created_at: record.created_at,
                        text: record.text,
                        user_screen_name: record.user.screen_name,
                        user_name: record.user.name,
                        user_profile_image_url: record.user.profile_image_url,
                        place_full_name: place_full_name
                    });
                }
            }
            callback(err, result, response);
        });
}

这是获取护照与Twitter进行身份验证的途径

app.get('/auth/twitter', passport.authenticate('twitter'));

如果您使用我的实现将令牌和密钥存储在req.user中,则将需要以下Passport策略。

var TwitterStrategy  = require('passport-twitter').Strategy;
module.exports.strategy = function(options) {
    return new TwitterStrategy({
        consumerKey: options.consumerKey,
        consumerSecret: options.consumerSecret,
        callbackURL: options.callbackURL
    },
    function(token, tokenSecret, profile, done) {
        // asynchronous verification, for effect...
        process.nextTick(function () {
            profile.twitter_token = token;
            profile.twitter_token_secret = tokenSecret;
            return done(null, profile);
        });
    });}

在配置了路由的AngularJS模块中,您将需要添加一个拦截器来捕获身份验证事件并将用户重新路由到Twitter的授权页面

angular.module('demoApi', ['demoApiSeet.interceptors', 'ngRoute'])
    .config(['twitterInterceptorProvider', '$routeProvider', '$locationProvider'
        ,'$httpProvider', function (twitterInterceptorProvider, $routeProvider,
            $locationProvider, $httpProvider) {
                twitterInterceptorProvider.RedirectUrl('/auth/twitter');
                $httpProvider.interceptors.push('twitterInterceptor');
}]);

最后,您需要有一个拦截器,该拦截器可以捕获401请求并重新路由到由nodejs路由详细说明的Twitter auth端点。 请注意,我实现了$ window.location.href = authUrl;。 因为我需要页面在页面api调用或页面加载期间路由到Twitter auth端点。 如果手动触发身份验证,则可能不需要。

angular.module('demoApiSeet.interceptors', [])
    .provider('twitterInterceptor', function() {
        var redirectUrl;
        this.RedirectUrl = function(value) {
            redirectUrl = value;
        };
        this.$get = ['$q', '$location', '$window', function($q, $location, $window) {
            return {
                response: function(response){
                    return response || $q.when(response);
                },
                responseError: function(rejection) {
                    $q.when(rejection.status == 401)
                    if (rejection.status === 401) {
                        if(redirectUrl) {
                            $location.path(redirectUrl);
                            var authUrl = $location.absUrl();
                            $window.location.href = authUrl;
                        }
                    } else if (rejection.status === 429) {
                        $location.path('/error');
                    }
                    return $q.reject(rejection);
                }
            }
        }];
})

希望对您有所帮助,您可以参考完整的实现,如果您需要更多信息,可以参考POC的完整实现。

===============>>#2 票数:2

如果只需要获取时间轴,则可以使用ng-tweets

如果您希望使用纯粹的客户端方法,并且只需要拉一条时间轴,则可以使用此处提供的ng-tweets模块:

https://github.com/forwardadvance/ng-tweets

它通过刮擦官方的Twitter小部件API并反向工程JSON feed来工作,因此您不需要身份验证令牌或密钥或任何服务器端支持代码。

免责声明

我是这个模块的作者。 我写它是为了解决这个问题,不希望在客户端公开oauth数据,也不希望使用官方的小部件HTML。

===============>>#3 票数:1 已采纳

所有您的推特请求都需要得到授权:

https://dev.twitter.com/docs/auth/authorizing-request

因此,您需要在每个上述文档的请求标头中传递一些OAuth数据

  ask by Igor Liphshon translate from so

未解决问题?本站智能推荐: