Angular js 在初始中间件身份验证后获取用户

Angular js get user after initial middleware authentication

我正在使用 Autho JWT 对前端 angular 应用程序的用户进行身份验证。成功验证后,它 returns 一个令牌。返回的令牌包含负载数据,其中包含用户名、user_id 和电子邮件。令牌的一个例子是:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6Im11dGhpb3JhIiwidXNlcl9pZCI6MiwiZXhwIjoxNDc1NTAxNDIxLCJlbWFpbCI6Im11dGhpb3JhQGdtYWlsLmNvbSJ9._jtLZ6FTlKZ_uDzqDgedIJ_4LC2LpiaVqgqfjT_4k_A

由于令牌是 base64 编码的,我很想知道如何从令牌中获取用户名。

如果令牌已验证,这里有一个获取用户的解决方案

/*global angular*/
angular.module('authService', [])

// ===================================================
// auth factory to login and get information
// inject $http for communicating with the API
// inject $q to return promise objects
// inject AuthToken to manage tokens
// ===================================================
.factory('Auth', function($http, $q, AuthToken) {

    // create auth factory object
    var authFactory = {};

    // log a user in
    authFactory.login = function(username, password) {

        // return the promise object and its data
        return $http.post('/api/authenticate', {
            username: username,
            password: password
        })
            .success(function(data) {
                AuthToken.setToken(data.token);
                return data;
            });
    };

    // log a user out by clearing the token
    authFactory.logout = function() {
        // clear the token
        AuthToken.setToken();
    };

    // check if a user is logged in
    // checks if there is a local token
    authFactory.isLoggedIn = function() {
        if (AuthToken.getToken()) 
            return true;
        else
            return false;   
    };

    // get the logged in user
    authFactory.getUser = function() {
        if (AuthToken.getToken())
            return $http.get('/api/me', { cache: true });
        else
            return $q.reject({ message: 'User has no token.' });        
    };

    // return auth factory object
    return authFactory;

})

// ===================================================
// factory for handling tokens
// inject $window to store token client-side
// ===================================================
.factory('AuthToken', function($window) {

    var authTokenFactory = {};

    // get the token out of local storage
    authTokenFactory.getToken = function() {
        return $window.localStorage.getItem('token');
    };

    // function to set token or clear token
    // if a token is passed, set the token
    // if there is no token, clear it from local storage
    authTokenFactory.setToken = function(token) {
        if (token)
            $window.localStorage.setItem('token', token);
        else
            $window.localStorage.removeItem('token');
    };

    return authTokenFactory;

})

// ===================================================
// application configuration to integrate token into requests
// ===================================================
.factory('AuthInterceptor', function($q, $location, AuthToken) {

    var interceptorFactory = {};

    // this will happen on all HTTP requests
    interceptorFactory.request = function(config) {

        // grab the token
        var token = AuthToken.getToken();

        // if the token exists, add it to the header as x-access-token
        if (token) 
            config.headers['x-access-token'] = token;

        return config;
    };

    // happens on response errors
    interceptorFactory.responseError = function(response) {

        // if our server returns a 403 forbidden response
        if (response.status == 403) {
            AuthToken.setToken();
            $location.path('/login');
        }

        // return the errors from the server as a promise
        return $q.reject(response);
    };

    return interceptorFactory;

});