Angular.js:结合 Restangular 和 oauth-ng

Angular.js: Combine Restangular and oauth-ng

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

现在我想使用 Restangular and oauth-ng

连接 AngularJS 前端

但是我怎样才能让两者就 oauth 令牌进行交互?

Oauth-ng 应该处理 login/logout 和令牌刷新。 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()});
    });

但是这段代码会报错"Unknown provider: AccessToken".

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

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

感谢您的帮助!

AccessToken 变量未注入您正在使用的范围内。 您是否尝试将 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/');
});