【问题标题】:Trying to retrieve param from JWT试图从 JWT 检索参数
【发布时间】:2017-04-11 12:11:17
【问题描述】:

我是使用 Json Web Tokens 的新手,最近为一个项目实施了一个 Angular 授权教程,它非常适合我的授权需求。

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

现在我想在客户端解码 JWT 并提取用户 _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');
});

我的目标是添加一个解析令牌的函数,然后让我提取一个或多个参数。

【问题讨论】:

    标签: angularjs express jwt


    【解决方案1】:

    JWT (Learn JSON Web Tokens) 允许对其包含的数据进行签名和/或加密。鉴于您提到了用于身份验证的 JWT,几乎可以肯定您收到的令牌是刚刚签名的。 这种假设的前提是,如果没有签名,您就不能信任其中的信息,因此将其用于身份验证是没有意义的,并且加密的令牌并未广泛使用。

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

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

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


    最后,您提到要提取用户标识符以便在其他调用中使用它;如果其他调用根据收到的用户标识符做出敏感决定,这似乎并不安全。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 2014-08-24
      相关资源
      最近更新 更多