Rumah >rangka kerja php >ThinkPHP >Contoh terperinci thinkphp6 menggunakan pengesahan jwt

Contoh terperinci thinkphp6 menggunakan pengesahan jwt

WBOY
WBOYke hadapan
2022-06-24 12:57:124575semak imbas

Artikel ini membawakan anda pengetahuan yang berkaitan tentang thinkphp, yang terutamanya memperkenalkan isu penggunaan pengesahan jwt Mari kita lihat bersama-sama.

Contoh terperinci thinkphp6 menggunakan pengesahan jwt

Pembelajaran yang disyorkan: "Tutorial Video PHP"

thinkphp6 menggunakan jwt

  1. Pelanggan menggunakan nama pengguna dan kata laluan untuk meminta log masuk
  2. Pelayan menerima permintaan dan mengesahkan nama pengguna dan kata laluan
  3. Selepas pengesahan berjaya, pelayan akan mengeluarkan token dan mengembalikan token kepada pelanggan
  4. Selepas menerima token, pelanggan boleh menyimpannya, seperti memasukkannya ke dalam kuki
  5. Setiap kali pelanggan meminta sumber daripada pelayan, ia perlu membawa token yang dikeluarkan oleh pelayan , yang boleh berada dalam kuki atau Pengepala membawa
  6. Pelayan menerima permintaan dan kemudian mengesahkan token yang dibawa dalam permintaan klien Jika pengesahan berjaya, ia mengembalikan data permintaan kepada klien

Pasang sambungan jwt

composer require firebase/php-jwt

Selepas pemasangan, pergi ke folder firebase dalam direktori vendor

Contoh terperinci thinkphp6 menggunakan pengesahan jwt

Panggil pengekodan dan kaedah nyahkod dalam JWT untuk menjana token dan mengesahkan token

Fail global common.php dalam direktori aplikasi projek digunakan dan dijadikan kaedah awam Memandangkan saya mempunyai berbilang aplikasi, saya menulisnya dalam common.php di bawah api. Anda boleh melaraskannya dengan sewajarnya mengikut keperluan anda

Contoh terperinci thinkphp6 menggunakan pengesahan jwt

Mula-mula memperkenalkan JWT, dan kemudian tulis dua kaedah untuk menjana pengesahan tandatangan dan token pengesahan.

<?phpuse  \Firebase\JWT\JWT;use Firebase\JWT\Key;// 应用公共文件/**
 * 生成验签
 * @param $uid 用户id
 * @return mixed
 */function signToken($uid){
    $key=&#39;abcdefg&#39;;         //自定义的一个随机字串用户于加密中常用的 盐  salt
    $token=array(
        "iss"=>$key,        //签发者 可以为空
        "aud"=>'',          //面象的用户,可以为空
        "iat"=>time(),      //签发时间
        "nbf"=>time(),      //在什么时候jwt开始生效
        "exp"=> time()+30,  //token 过期时间
        "data"=>[           //记录的uid的信息
            'uid'=>$uid,
        ]
    );
    $jwt = JWT::encode($token, $key, "HS256");  //生成了 token
    return $jwt;}/**
 * 验证token
 * @param $token
 * @return array|int[]
 */function checkToken($token){
    $key='abcdefg';     //自定义的一个随机字串用户于加密中常用的 盐  salt
    $res['status'] = false;
    try {
        JWT::$leeway    = 60;//当前时间减去60,把时间留点余地
        $decoded        = JWT::decode($token, new Key($key, 'HS256')); //HS256方式,这里要和签发的时候对应
        $arr            = (array)$decoded;
        $res['status']  = 200;
        $res['data']    =(array)$arr['data'];
        return $res;

    } catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
        $res['info']    = "签名不正确";
        return $res;
    }catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
        $res['info']    = "token失效";
        return $res;
    }catch(\Firebase\JWT\ExpiredException $e) { // token过期
        $res['info']    = "token过期";
        return $res;
    }catch(Exception $e) { //其他错误
        $res['info']    = "未知错误";
        return $res;
    }}

Gunakan jwt untuk menjana token

    /**
     * 使用jwt生成token字符串
     */
    public function setJwtToken()
    {
        $uid = input('uid'); // 接收生成token字符串 如:123
        $token = signToken($uid);
        // 生成字符串: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhYmNkZWZnIiwiYXVkIjoiIiwiaWF0IjoxNjQxNDUwMTU0LCJuYmYiOjE2NDE0NTAxNTcsImV4cCI6MTY0MTQ1NzM1NCwiZGF0YSI6eyJ1aWQiOiIxMjMifX0.I_GAkMsOhtEpIPkizCuQA-b9H6ovSovWx0AwAYI-b0s
        echo $token;die;
    }

    /**
     * 使用jwt验证token字符串
     */
    public function checkJwtToken()
    {
        $token  = input('token'); // 接收生成token字符串
        $result = checkToken($token);
        // Array ( [status] => 200 [data] => Array ( [uid] => 123 ) )
        print_r($result);die;
    }

Buat pengawal pengguna

<?phpdeclare  (strict_types = 1);namespace app\api\controller;use think\facade\Db;use think\Request;class User{
    public function login(Request $request)
    {
        if ($request->isPost()){
            $username = $request->param('username','','trim');
            $password = $request->param('password','','trim');

            //查询数据库
            $user = Db::name('user')->where('username',$username)->find();

            if (!$user){
                return json(['status' => 'fail','msg' => '用户名不存在']);
            }
            if ($user['password']!==md5($password)){
                return json(['status' => 'fail','msg' => '密码错误']);
            }
            $getToken = $this->token($user);
            return json(['status' => 'success','msg' => '登陆成功','token' => $getToken]);
        }
    }
    public function token($user)
    {
        $uid = $user['username']; // 接收生成token字符串 如:123
        $token = signToken($uid);
        dd($token);
    }
    /**
     * 验证token
     */
    public function chToken()
    {
        $token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhYmNkZWZnIiwiYXVkIjoiIiwiaWF0IjoxNjQ4MDkwMDkyLCJuYmYiOjE2NDgwOTAwOTIsImV4cCI6MTY0ODA5MDEyMiwiZGF0YSI6eyJ1aWQiOiJcdTVmMjBcdTRlMDlcdTk4Y2UifX0.oJFpNcZ6stMymOCbD-meX0IPEIYLYNcwKxhMItF2cMw';
        $result = checkToken($token);
        // Array ( [status] => 200 [data] => Array ( [uid] => 123 ) )
        print_r($result);die;
    }}

Pengguna berjaya log masuk dan mengembalikan token ke hujung hadapan menyimpan token dan membawa token dalam pengepala semasa permintaan seterusnya menerima token dan mengesahkannya dalam perisian tengah

Buat perisian tengah api

<?phpdeclare  (strict_types = 1);namespace app\middleware;class Api{
    /**
     * 处理请求
     *
     * @param \think\Request $request
     * @param \Closure       $next
     * @return Response
     */
    public function handle($request, \Closure $next)
    {
        //toke 合法性验证
        $header = $request->header();
        //判读请求头里有没有token
        if(!isset($header['token'])){
            return json(['code'=>440,'msg'=>'request must with token']);
        }
        $token = $header['token'];

        try {
            // token 合法
            $token = checkToken($token);
        }catch (\Exception $e){
            return json(['code'=>440,'msg'=>'invalid token']);
        }

        return $next($request);
    }}

Akhir sekali, terdapat dua penyelesaian untuk menangani isu tamat tempoh token Yang pertama ialah menetapkan masa token lebih lama supaya token tidak tamat tempoh, tetapi ini Terdapat kelemahan Apabila pelanggan mendapat token, ia adalah sama dengan memiliki kunci, dan inisiatif berada di tangan pengguna. Jadi penyelesaian ini tidak disyorkan. Yang kedua ialah pemprosesan bahagian belakang Apabila token tamat tempoh, token diperoleh semula dan token baharu dihantar ke hujung hadapan menyimpan token baharu, menggantikan token asal dan membawa token baharu dengan permintaan seterusnya permintaan token.

Saya adalah pengaturcara Fengfeng, seorang pengaturcara yang suka belajar dan bermain-main.

Pembelajaran yang disyorkan: "Tutorial Video PHP"

Atas ialah kandungan terperinci Contoh terperinci thinkphp6 menggunakan pengesahan jwt. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:csdn.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:apakah model dalam thinkphpArtikel seterusnya:apakah model dalam thinkphp