我正在创造一种“社交网络”。现在我正在创建身份验证部分。今天我学习了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?
您可以将此令牌与数据库中的某些数据匹配吗?
答案 0 :(得分:2)
1)JWT令牌未加密,因此可以轻松读取其中的数据。但是,它包含一个签名,只能使用您在创建令牌时设置的密钥进行验证。您可以检查签名以查看令牌是否未被篡改。
2)令牌可以存储在任何地方,因为它太小了。请记住,令牌可以很容易地读取,但不能改变。不要在令牌中存储任何敏感数据。
检查令牌时,要检查的重要事项是签名和exp
时间,以确定令牌仍然有效。构造良好的令牌不需要完整的数据库验证,而只需检查自发出令牌后用户的权限是否已更改,如果有,则使用更新的数据重新创建令牌或强制用户登录试。