将 auth0 令牌传递给 $http.get (angular)
Passing auth0 token to $http.get (angular)
在将 auth0 令牌附加到 http.get 对希望看到该令牌的 api 的请求时遇到了一些问题。令牌在用户登录时创建,并保存在浏览器的本地存储中。那部分工作正常。因此,它将令牌附加到我遇到问题的 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 请求。知道为什么会发生这种情况吗?
我还包含了浏览器控制台中的 headers 如果这有帮助...
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:*
不确定我是否正确理解了您的问题。但这是我在身份验证后将 http 请求中的令牌设置为我的 API 的方法:
$http.defaults.headers.common['token'] = token;
header 的名称取决于您 API 的期望(可能是 X-Auth、Token、X-Token...)。
您不会在 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;
}
}
您没有返回从 localStorage 获得的令牌。
@eer 反应不错,但他还是需要保存新刷新的token,这样下次就不用再调用那个端点了。
代码如下:
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
的更多信息
谢谢!
在将 auth0 令牌附加到 http.get 对希望看到该令牌的 api 的请求时遇到了一些问题。令牌在用户登录时创建,并保存在浏览器的本地存储中。那部分工作正常。因此,它将令牌附加到我遇到问题的 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 请求。知道为什么会发生这种情况吗?
我还包含了浏览器控制台中的 headers 如果这有帮助...
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:*
不确定我是否正确理解了您的问题。但这是我在身份验证后将 http 请求中的令牌设置为我的 API 的方法:
$http.defaults.headers.common['token'] = token;
header 的名称取决于您 API 的期望(可能是 X-Auth、Token、X-Token...)。
您不会在 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;
}
}
您没有返回从 localStorage 获得的令牌。
@eer 反应不错,但他还是需要保存新刷新的token,这样下次就不用再调用那个端点了。
代码如下:
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
的更多信息谢谢!