用JWT进行PHP身份验证

用JWT进行PHP身份验证,php,json,jwt,Php,Json,Jwt,我正在创建一种“社交网络”。现在我正在创建身份验证部分。今天我学习了JSON Web令牌 1) 我读到JWT的使用是安全的,因为JWT是用一个秘密密钥签名的。但后来我在网上找到了一些工具,比如。我尝试使用firebase/phpjwt用PHP构建一些JWT令牌。像jwt.io这样的工具可以提取我放在jwt中的数据(比如用户ID)。这怎么安全呢?难道有人不能使用旧的JWT创建一个新的JWT,但使用不同的用户ID吗 示例:我创建了以下令牌: eyJ0eXAiOiJKV1QiLCJhbGciOiJIU

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

1) 我读到JWT的使用是安全的,因为JWT是用一个秘密密钥签名的。但后来我在网上找到了一些工具,比如。我尝试使用firebase/phpjwt用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的本地存储?最安全的方法是什么

第二:如何认证用户?我会这样做:

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

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

// what to do here?
您可以将此令牌与数据库中的某些数据或其他内容进行匹配吗?

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

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

检查令牌时,需要检查的重要内容是签名和查看令牌是否仍然有效的时间。构造良好的令牌不需要完全的数据库验证,只需检查用户的权限在颁发令牌后是否没有更改,如果有更改,则使用更新的数据重新创建令牌或强制用户再次登录。

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

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


检查令牌时,需要检查的重要内容是签名和查看令牌是否仍然有效的时间。构造良好的令牌不需要完全的数据库验证,只需检查用户的权限在颁发令牌后是否没有更改,如果有更改,则使用更新的数据重新创建令牌或强制用户再次登录。

如果有人修改令牌中的数据,则签名(令牌的第三部分)将是无效的。由您对从客户端获得的内容进行身份验证,以确保数据和签名匹配。因为这是使用JWT时的主要特性,所以我建议您阅读更多关于它们的内容。如果有人修改令牌中的数据,签名(令牌的第三部分)将无效。由您对从客户端获得的内容进行身份验证,以确保数据和签名匹配。因为这是使用JWT时的主要特性,所以我建议您阅读更多关于它们的内容。请注意,JWT可以加密(请参阅)。另外,您应该提到
alg
头成员和
iss
sub
aud
声明与
exp
声明一样重要。此外,只有用于创建的私钥才能验证签名的说法是错误的。公钥就足够了。@Stanimir Stoyanov我还没有对RSA或ECDSA加密做过任何陈述,它们有私钥和公钥。在这种情况下,您是对的,公钥可用于验证签名。在本例中,他使用的是HS256,它只有密钥。@如果你是对的,我忽略了OP使用HS256的事实。请注意JWT可以加密(请参阅)。另外,您应该提到
alg
头成员和
iss
sub
aud
声明与
exp
声明一样重要。此外,只有用于创建的私钥才能验证签名的说法是错误的。公钥就足够了。@Stanimir Stoyanov我还没有对RSA或ECDSA加密做过任何陈述,它们有私钥和公钥。在这种情况下,您是对的,公钥可用于验证签名。在本例中,他使用的是HS256,它只有密钥。@如果你是对的,我忽略了OP使用的是HS256这一事实。