2016-11-27 44 views
0

我不熟悉使用Json Web令牌,最近为项目实施了角度授权教程,该教程适合我的授权需求。尝试从JWT中检索参数

https://devdactic.com/restful-api-user-authentication-1/

现在我想在智威汤逊在客户端进行解码,并在奥得河拔出用户_id使用它作为其他API调用一个唯一的ID,但我不明白该怎么做。

有没有人有一个很好的拉动和使用从JWT角度的信息的例子?

这里是我的身份验证服务:

'use strict'; 

angular.module('App') 

.service('AuthService', function($q, $http, API_ENDPOINT) { 
    var LOCAL_TOKEN_KEY = 'My big secret here'; 
    var isAuthenticated = false; 
    var authToken; 

    function loadUserCredentials() { 
    var token = window.localStorage.getItem(LOCAL_TOKEN_KEY); 
    if (token) { 
     useCredentials(token); 
    } 
    } 

    function storeUserCredentials(token) { 
    window.localStorage.setItem(LOCAL_TOKEN_KEY, token); 
    useCredentials(token); 
    } 

    function useCredentials(token) { 
    isAuthenticated = true; 
    authToken = token; 

    // Set the token as header for your requests! 
    $http.defaults.headers.common.Authorization = authToken; 
    } 

    function destroyUserCredentials() { 
    authToken = undefined; 
    isAuthenticated = false; 
    $http.defaults.headers.common.Authorization = undefined; 
    window.localStorage.removeItem(LOCAL_TOKEN_KEY); 
    } 

    var register = function(user) { 
    return $q(function(resolve, reject) { 
     $http.post(API_ENDPOINT.url + '/signup', user).then(function(result) { 
     if (result.data.success) { 
      resolve(result.data.msg); 
     } else { 
      reject(result.data.msg); 
     } 
     }); 
    }); 
    }; 

    var login = function(user) { 
    return $q(function(resolve, reject) { 
     $http.post(API_ENDPOINT.url + '/authenticate', user).then(function(result) { 
     if (result.data.success) { 
      storeUserCredentials(result.data.token); 
      resolve(result.data.msg); 
     } else { 
      reject(result.data.msg); 
     } 
     }); 
    }); 
    }; 

    var logout = function() { 
    destroyUserCredentials(); 
    }; 

    loadUserCredentials(); 

    return { 
    login: login, 
    register: register, 
    logout: logout, 
    isAuthenticated: function() {return isAuthenticated;}, 
    }; 
}) 

.factory('AuthInterceptor', function ($rootScope, $q, AUTH_EVENTS) { 
    return { 
    responseError: function (response) { 
     $rootScope.$broadcast({ 
     401: AUTH_EVENTS.notAuthenticated, 
     }[response.status], response); 
     return $q.reject(response); 
    } 
    }; 
}) 

.config(function ($httpProvider) { 
    $httpProvider.interceptors.push('AuthInterceptor'); 
}); 

我的目标是添加解析令牌的功能,让我拉一个或多个PARAMS。

回答

0

JWT(Learn JSON Web Tokens)允许其包含的数据进行签名和/或加密。鉴于您提到用于身份验证的JWT,几乎可以确定您收到的令牌只是被签名。 这个假设的前提是,如果它没有签名,你就不能相信内部的信息,所以用它进行验证是没有意义的,而加密的令牌没有被广泛使用。

此外,在HTTP环境中使用时,推荐表示令牌的方法是base64url对令牌的各个部分进行编码,包括数据有效载荷;这意味着访问数据可以通过应用base64url解码然后将结果解释为JSON来轻松实现。但是,为了信任这些数据,您必须验证签名并进行适用于您的用例的任何其他验证。

您可以检查jwt.io libraries部分以获取以Javascript实现并支持JWT的库的列表。

例如,您可以检查Auth0 angular-jwt库并查看example on how to decode a token


最后,你提到你想拉用户标识符,以便在其他调用中使用它;如果其他呼叫根据接收到的用户标识符做出敏感决定,该用户标识符似乎不安全。