Существует доступно $cookies
обслуживания в API AngularJS с использованием модуля ngCookies
. Он может быть использован, как показано ниже:
function controller($cookies) {
//set cookie
$cookies.put('token', 'myBearerToken');
//get cookie
var token=$cookies.get('token');
//remove token
$cookies.remove('token');
}
controller.$inject=['$cookies'];
В вашем случае это будет:
//inject $cookies into controller
$scope.GetAuthorizeData = function() {
$http({
method: 'GET',
url: "/api/Values",
headers: { 'authorization': 'bearer <myTokenId>' },
})
.success(function (data) {
$cookies.put('token', data);
}).error(function() {
alert("Failed :(");
});
};
Вы также должны добавить angular-cookies module код. И добавьте его в свое угловое приложение: angular.module('myApp', ['ngCookies']);
. Docs for Angular Cookies.
Я также хотел бы предложить использовать Http interceptor
, который будет устанавливать заголовок канала для каждого запроса, вместо того, чтобы вручную устанавливать его самостоятельно для каждого запроса.
//Create a http interceptor factory
function accessTokenHttpInterceptor($cookies) {
return {
//For each request the interceptor will set the bearer token header.
request: function($config) {
//Fetch token from cookie
var token=$cookies.get['token'];
//set authorization header
$config.headers['Authorization'] = 'Bearer '+token;
return $config;
},
response: function(response) {
//if you get a token back in your response you can use
//the response interceptor to update the token in the
//stored in the cookie
if (response.config.headers.yourTokenProperty) {
//fetch token
var token=response.config.headers.yourTokenProperty;
//set token
$cookies.put('token', token);
}
return response;
}
};
}
accessTokenHttpInterceptor.$inject=['$cookies'];
//Register the http interceptor to angular config.
function httpInterceptorRegistry($httpProvider) {
$httpProvider.interceptors.push('accessTokenHttpInterceptor');
}
httpInterceptorRegistry.$inject=['$httpProvider'];
//Assign to module
angular
.module('myApp')
.config(httpInterceptorRegistry)
.factory('accessTokenHttpInterceptor', accessTokenHttpInterceptor)
Имея http interceptor
на месте вам не нужно, чтобы установить Authorization header
для каждого запроса.
function service($http) {
this.fetchToken=function() {
//Authorization header will be set before sending request.
return $http
.get("/api/some/endpoint")
.success(function(data) {
console.log(data);
return data;
})
}
}
service.$inject=['$http']
Как заявлено Борисом: есть другие способы решить эту проблему. Вы также можете использовать localStorage
для хранения токена.Это также можно использовать с http-перехватчиком. Просто измените реализацию с файлов cookie на localStorage.
function controller($window) {
//set token
$window.localStorage['jwt']="myToken";
//get token
var token=$window.localStorage['jwt'];
}
controller.$inject=['$window'];
Я. Готов. Спасибо. Хорошее объяснение. –
Привет, где будет '' be? где его найти? –
Kavipriya