redis + tokenログイン
序文
ログインは一般的にsession
処理でき、使用は比較的簡単ですが、一般的にはweb
最終的に多く使用されます。複数の端末での実行を検討する必要がある場合redis+token
は、使用する方が便利です。redis
データベースストレージを使用する代わりに使用するのはなぜtoken
ですか。もちろん、データベースを保存したり、バックグラウンドでデータベースのクエリtoken
フィールドをリクエストしたりできますが、同時実行性が高いことを考えると、redis
一般的にユーザー情報をクエリする場所が少なく、ログインしているかどうかを判断する場合が多くなります。
1.一意のトークンを生成します
新しいcommon
クラスを作成して、文字列に関連するメソッドを具体的に配置できます。
<?php
namespace app\common\lib;
class Str
{
public static function getLoginToken($string){
// 生成 token
$str = md5(uniqid(md5(microtime(true)), true));
return sha1($str . $string);
}
}
2.トークンを設定し、トークンをフロントエンドに返します
ログインインターフェイスでは、パラメータが最初に判断されます。パラメータが渡されると、それらtoken
は世代にtoken
保存されradis
、有効期限が設定されてtoken
から、フロントエンドに戻ります。
// business层的登录方法
public function login($data){
// 省略登录参数验证与数据库更新操作
$token = Str::getLoginToken($data["phone_number"]);
$redisData = [
"id" => $userId,
"username" => $username
];
// 保存token到redis, 有效期7天
$res = cache(config("radis.token_pre").$token, $redisData, 7 * 24 * 3600);
return $res ? ["token" => $token, "username" => $username] : false;
}
メソッドは構成ファイルで設定さ
cache
れているためcache.php
、ここでは保存が直接使用されます。詳細についてredis
は、この記事の3.4構成キャッシュredisを参照してください:Alibaba CloudSMSとredisを組み合わせてログインを実現
// controller控制器层的登录方法 调用business层的方法
$result = (new User())->login($data);
if($result){
return show(config('status.success'), "登录成功", $result);
}else{
return show(config('status.error'), "登录失败");
}
フロントエンドリクエストが成功すると、取得さtoken
れて保存されます。次回リクエストを送信するときに、バックエンドに持って行ってredis
クエリを実行できます。リクエストtoken
が存在しないか期限切れになると、バックエンドによってインターセプトされます。
ヒント:これは
token
100%安全ではありません。ユーザーが取得した場合token
、有効期間中はtoken
いつでもバックグラウンドデータにアクセスできるためです。これも解決できない問題です。
3、ログインインターセプター(ログインが必要/ログインは不要)
書かれる。。。