【发布时间】:2018-06-30 10:56:47
【问题描述】:
我正在创建一种“社交网络”。现在我正在创建身份验证部分。今天学习了 JSON Web Tokens。
1) 我读到 JWT 可以安全使用,因为它们是用密钥签名的。但后来我在网上找到了一些工具,比如https://jwt.io。我尝试使用 firebase/php-jwt 使用 PHP 构建一些 JWT 令牌。 jwt.io 之类的工具可以提取我放入 JWT 中的数据(如用户 ID)。这怎么可能安全?有人不能使用旧的 JWT 创建一个新的 JWT,但用户 ID 不同吗?
一个例子:我创建了以下令牌:
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?
你能把这个令牌与数据库中的一些数据或其他东西相匹配吗?
【问题讨论】:
-
如果有人修改了token中的数据,签名(token的第三部分)将失效。您可以对从客户端获得的内容进行身份验证,以确保数据和签名匹配。由于这是使用 JWT 时的主要功能,我建议您阅读更多有关它们的信息。 Here's a pretty good article