将auth0标记传递给$ http.get(angular)

时间:2015-02-25 15:40:09

标签: javascript angularjs auth0

在让auth0令牌附加到希望看到令牌的api的http.get请求时遇到一些问题。用户登录时创建令牌并保存在浏览器本地存储中。那部分工作正常。所以它将令牌附加到我遇到问题的http.get。

到目前为止,我有以下代码。在我的app.js中我有以下内容......

var QuoteApp = angular.module('QuoteApp', ['ui.router', 'auth0', 'angular-jwt', 'angular-storage', 'ngCookies']);
priceQuoteApp.config(function ($stateProvider, $urlRouterProvider, $httpProvider, authProvider, $locationProvider, jwtInterceptorProvider) {

jwtInterceptorProvider.tokenGetter = function(store, jwtHelper, auth) {
    var idToken = store.get('token');
    var refreshToken = store.get('refreshToken');
    // If no token return null
    if (!idToken || !refreshToken) {
        return null;
    }        
}
$httpProvider.interceptors.push('jwtInterceptor');

});

然后我有一个$ http.get函数,我向api发送一个也需要令牌的请求

在我的 api.service.js 文件中,我有这个......

this.getStuff = function (attributes) {
    return $http.get('http://www.theurl.com/api/getstuff?json=' + JSON.stringify(attributes)).
        success(function(){
        });
};

我从我的 getStuff.js 文件中调用了getStuff函数......

  $scope.getTheStuff = function (){
         Services.getStuff($scope.Attributes)
         .then(function (res) {
         })
    };

所以我从服务器收到身份验证错误 - 401(未经授权),这对我来说意味着由于某种原因令牌没有附加到http.het请求。有什么想法可能会发生这种情况吗?

我还在浏览器控制台中添加了标题,如果这样会有帮助......

Remote Address:10.34.51.34:80
Request URL:http://www.theurl.com/api/getstuff?json={stuff in here}]}
Request Method:GET
Status Code:401 Unauthorized
Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate, sdch
Host:http://www.theurl.com
Origin:http://localhost:63342
Referer:http://localhost:63342/price-tool-ui-1/app/index.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36
Query String Parametersview sourceview URL encoded
json:{stuff in here}]}
Access-Control-Allow-Methods:GET, POST, OPTIONS, PUT, DELETE
Access-Control-Allow-Origin:*

3 个答案:

答案 0 :(得分:4)

您未在jwtInterceptorProvider.tokenGetter中返回令牌。来自docs

jwtInterceptorProvider.tokenGetter = function(store, $http, jwtHelper) {
  var idToken = store.get('token');
  var refreshToken = store.get('refreshToken');
  if (jwtHelper.isTokenExpired(idToken)) {
    return auth.refreshIdToken(refreshToken);
  } else {
    return idToken;
  }
}

答案 1 :(得分:2)

您没有返回从localStorage获得的令牌。

@eer响应非常好,但他仍然需要保存新刷新的令牌,以便您下次不必再次调用该端点。

代码如下:

var refreshingToken = null;
jwtInterceptorProvider.tokenGetter = function(store, $http, jwtHelper) {
  var token = store.get('token');
  var refreshToken = store.get('refreshToken');
  if (token) {
    if (!jwtHelper.isTokenExpired(token)) {
      return store.get('token');
    } else {
      if (refreshingToken === null) {
        refreshingToken =  auth.refreshIdToken(refreshToken).then(function(idToken) {
          store.set('token', idToken);
          return idToken;
        }).finally(function() {
            refreshingToken = null;
        });
      }
      return refreshingToken;
    }
  }
}

希望它有所帮助!

有关https://github.com/auth0/auth0-angular/blob/master/docs/refresh-token.md

的更多信息

谢谢!

答案 2 :(得分:0)

我不确定我是否正确理解您的问题。但这是我在验证后在http请求中设置令牌到我的API的方法:

$http.defaults.headers.common['token'] = token;

标题的名称取决于API的预期(可能是X-Auth,Token,X-Token ....)。