使用JWT进行PHP身份验证

时间:2018-01-21 19:42:40

标签: php json jwt

我正在创造一种“社交网络”。现在我正在创建身份验证部分。今天我学习了JSON Web Tokens。

1)我读到JWT的使用是安全的,因为它是用密钥签名的。但后来我在网上发现了一些像https://jwt.io这样的工具。我尝试用firebase / php-jwt用PHP构建一些JWT令牌。像jwt.io这样的工具可以提取我放在JWT中的数据(比如用户ID)。这怎么可能安全?有人可以使用旧的JWT但使用不同的用户ID创建新的JWT吗?

一个例子:我创建了以下标记:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJNeUFQIiwiaWF0IjoxNTE2NTYzMTM0LCJleHAiOjE1MTY1NjQzNDAsImF1ZCI6Ind3dy5leGFtcGxlLmNvbSIsInN1YiI6ImFkbWluQGV4YW1wbGUuY29tIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOiJmYWxzZSJ9.dCtYVpFXhoQmzOdX_dW1yFHEcZ9aZ1I9MC33lJGapvY

如果您在jwt.io中粘贴此令牌,您将看到有效负载是“name:John Doe”和“admin:false”。这不安全吗?或者它是安全的,因为您需要密钥来重新创建JWT。

关闭记录:你不能将敏感信息存储在JWT中我猜...

2)如何使用PHP和JWT“登录”用户?我创建了一个快速演示,我不确定代码是否“有效”,但我想你会明白我的意思。

if (isset($_POST['submit'])) {

    $user = $_POST['user'];

    $pass = $_POST['pass'];

    if($user = 'my_username' && $password == 'my_password') {

        // user is logged in

        // create a JWT here

    } else {

        // wrong credentials!

    }

}

现在,问题是:如何存储此令牌?在饼干?在一次会议中?使用HTML5的localStorage?最安全的方法是什么?

其次:如何验证用户?我会这样做:

// my secret key
$secret = 'MY_SECRET_KEY';

// decode the token
$token = JWT::decode($token, $secret, array('HS256'));

// what to do here?

您可以将此令牌与数据库中的某些数据匹配吗?

1 个答案:

答案 0 :(得分:2)

1)JWT令牌未加密,因此可以轻松读取其中的数据。但是,它包含一个签名,只能使用您在创建令牌时设置的密钥进行验证。您可以检查签名以查看令牌是否未被篡改。

2)令牌可以存储在任何地方,因为它太小了。请记住,令牌可以很容易地读取,但不能改变。不要在令牌中存储任何敏感数据。

检查令牌时,要检查的重要事项是签名和exp时间,以确定令牌仍然有效。构造良好的令牌不需要完整的数据库验证,而只需检查自发出令牌后用户的权限是否已更改,如果有,则使用更新的数据重新创建令牌或强制用户登录试。