Angular.js:组合Restangular和oauth-ng

时间:2015-04-21 14:34:49

标签: angularjs oauth restangular

我们构建了一个实现OAuth 2.0的RestFul API

现在我想使用Restangularoauth-ng连接AngularJS前端

但是如何才能让双方就oauth令牌进行互动?

Oauth-ng应该处理登录/注销和令牌刷新。 Restangular应该从oauth-ng获取access_token以发送带有所有请求的令牌。

我当前的代码是这样实现的。

angular
    .module('myapp', ['oauth','restangular'/* ... */ ])
    .config(function ($routeProvider,$locationProvider,RestangularProvider,AccessToken) {
        $routeProvider
            .when('/access_token=:accessToken', {
                template: '',
                controller: function ($location, AccessToken) {
                    var hash = $location.path().substr(1);
                    AccessToken.setTokenFromString(hash);
                    console.log(AccessToken); //THIS WORKS
                    $location.path('/');
                    $location.replace();
                }
            })
            .when('/', {
                templateUrl: 'views/main.html',
                controller: 'MainCtrl'
            })
            .otherwise({
                redirectTo: '/'
            });

        $locationProvider.html5Mode({
            enabled: true,
            requireBase: true
        }).hashPrefix('!');

        RestangularProvider.setBaseUrl('https://myapi.local/');
        // next line throws error
        RestangularProvider.setDefaultHeaders({Authorization: 'Bearer ' + AccessToken.get()});
    });

但此代码会抛出错误"未知提供商:AccessToken"。

似乎" AccessToken"尚未在配置阶段提供。 但我不想一次又一次地在每个控制器中实现这个通用功能。

连接两个模块的好方法是什么?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

AccessToken var不会在您使用它的范围内注入。 您是否尝试将令牌设置为Restangular设置到您履行承诺的位置。例如:

angular
.module('myapp', ['oauth','restangular'/* ... */ ])
.config(function ($routeProvider,$locationProvider,RestangularProvider) {
    $routeProvider
        .when('/access_token=:accessToken', {
            template: '',
            controller: function ($location, AccessToken) {
                var hash = $location.path().substr(1);
                AccessToken.setTokenFromString(hash);
                RestangularProvider.setDefaultHeaders({Authorization: 'Bearer ' + AccessToken.get()});
                console.log(AccessToken); //THIS WORKS
                $location.path('/');
                $location.replace();
            }
        })
        .when('/', {
            templateUrl: 'views/main.html',
            controller: 'MainCtrl'
        })
        .otherwise({
            redirectTo: '/'
        });

    $locationProvider.html5Mode({
        enabled: true,
        requireBase: true
    }).hashPrefix('!');

    RestangularProvider.setBaseUrl('https://myapi.local/');
});