【问题标题】:How is angular-jwt decoding my JWT without a secret?angular-jwt 如何在没有秘密的情况下解码我的 JWT?
【发布时间】:2015-11-04 08:39:25
【问题描述】:

Auth0 团队创建了一个名为“angular-jwt”的东西,它有一个 jwtHelper 类。这个东西成功地解码了本地 JWT,没有我在服务器上使用的秘密。这怎么发生的?如果它们不安全,那么使用秘密对它们进行签名/加密有什么意义?

加密令牌的服务器上的功能(使用“jsonwebtoken”):

function createToken (user) {
    return jwt.sign(_.omit(user, 'password'), config.secret, { expiresInMinutes: 60*5 });
}

来自客户端的代码:

angular
    .module('sample.home', [
        'ui.router',
        'angular-storage',
        'angular-jwt'
    ])
    .config(function ($stateProvider) {
        $stateProvider
            .state('home', {
                url: '/',
                controller: 'HomeCtrl',
                templateUrl: 'modules/home/home.html',
                data: { requiresLogin: true }
            })
    })
    .controller('HomeCtrl', function homeController ($scope, $http, store, jwtHelper) {

        $scope.jwt = store.get('jwt');
        $scope.decodedJwt = $scope.jwt && jwtHelper.decodeToken($scope.jwt);

    });

这里是完整示例的链接:http://github.com/auth0/ang...

【问题讨论】:

    标签: node.js express jwt auth0 express-jwt


    【解决方案1】:

    JWT 使用编码,而不是加密。令牌包含的数据不是秘密,任何人都可以对其进行解码和查看。服务器的作用是使用秘密(在您的情况下为config.secret)对令牌进行签名,这实际上使得在不知道秘密的情况下无法修改令牌。因此,只有服务器能够更改令牌的内容,但任何人都可以读取它。

    【讨论】:

    • 啊啊……他们签了!我在想什么!!!?谢谢,尤里。
    • 作为参考,此答案仅适用于使用对称密钥(例如 HMAC-SHA256)时。也可以使用非对称密钥(例如 RSA-SHA256),它允许您使用私钥签署令牌并使用公钥验证它们。如果需要对客户端隐藏,也可以在令牌中加密声明,或者使用 JWE 完全加密令牌:tools.ietf.org/html/draft-ietf-jose-json-web-encryption-40
    • 这让我很开心......谢谢
    猜你喜欢
    • 2015-10-02
    • 1970-01-01
    • 2021-12-01
    • 2020-01-14
    • 2015-08-11
    • 2023-01-03
    • 2019-09-04
    • 2015-11-13
    • 2019-12-15
    相关资源
    最近更新 更多