在ThinkPHP框架中使用基于令牌的登录认证需要进行以下步骤:
生成令牌:在用户登录成功后,生成一个令牌,并将令牌存储在数据库中。可以使用uniqid()函数生成唯一的令牌。
发送令牌:将令牌返回给客户端(一般是前端页面),可以使用JWT(JSON Web Token)等方式将令牌加密后发送。
验证令牌:在客户端发送请求时,将令牌作为参数发送给服务器端。服务器端需要对令牌进行验证,验证方法一般是解密JWT并验证其中的信息是否正确。
更新令牌:为了防止令牌被恶意利用,需要定期更新令牌。可以在每次用户请求时,将令牌的过期时间延长一段时间,这样就可以实现令牌的自动更新。
下面是一个基于JWT的令牌认证的示例代码:
use \Firebase\JWT\JWT;
class UserController extends Controller
{
public function login()
{
// 根据用户名和密码验证用户身份
// 如果验证成功,则生成一个令牌并返回给客户端
$user = UserModel::where('username', $username)->where('password', $password)->find();
if ($user) {
$token = array(
'user_id' => $user['id'],
'username' => $user['username'],
'exp' => time() + 3600 // 令牌过期时间为1小时
);
$jwt = JWT::encode($token, 'secret_key');
return json(array('code' => 200, 'msg' => '登录成功', 'token' => $jwt));
} else {
return json(array('code' => 400, 'msg' => '用户名或密码错误'));
}
}
public function getUserInfo()
{
// 获取请求头中的令牌
$jwt = request()->header('Authorization');
// 对令牌进行解密并验证
try {
$token = JWT::decode($jwt, 'secret_key', array('HS256'));
} catch (\Exception $e) {
return json(array('code' => 401, 'msg' => '令牌无效'));
}
// 获取用户信息并返回给客户端
$user = UserModel::get($token->user_id);
return json(array('code' => 200, 'msg' => '获取用户信息成功', 'data' => $user));
}
}
需要注意的是,上述代码中使用了Firebase\JWT库来进行JWT的加解密操作,因此需要在项目中引入该库。