>  기사  >  PHP 프레임워크  >  JWT 인증을 사용한 thinkphp6의 자세한 예

JWT 인증을 사용한 thinkphp6의 자세한 예

WBOY
WBOY앞으로
2022-06-24 12:57:124571검색

이 기사는 JWT 인증 사용에 관한 문제를 주로 소개하는 thinkphp에 대한 관련 지식을 제공합니다. 모두에게 도움이 되기를 바랍니다.

JWT 인증을 사용한 thinkphp6의 자세한 예

추천 학습: "PHP 비디오 튜토리얼"

thinkphp6 jwt 사용

  1. 클라이언트는 사용자 이름과 비밀번호를 사용하여 로그인을 요청합니다
  2. 서버는 요청을 받고 사용자 이름과 비밀번호를 확인합니다
  3. 이후 성공적으로 확인되면 서버는 토큰을 발행하고 클라이언트에 토큰을 반환합니다. 토큰을 받은 후 클라이언트는 이를 쿠키에 넣는 등 저장할 수 있습니다. 클라이언트는 리소스를 요청할 때마다 이를 서버에 가져와야 합니다. 발급된 토큰은 쿠키나 헤더에 포함될 수 있습니다
  4. 서버는 요청을 받은 다음 클라이언트 요청에 포함된 토큰을 확인합니다. 확인에 성공하면 요청 데이터가 클라이언트에 반환됩니다
  5. jwt 확장 설치
  6. composer require firebase/php-jwt
  7. 설치 후 vender 디렉토리의 firebase 폴더로 이동하세요

JWT의 encode 및 decode 메소드를 호출하여 토큰을 생성하고 토큰을 확인하세요

JWT 인증을 사용한 thinkphp6의 자세한 예프로젝트의 common.php 전역 파일 app 디렉토리를 사용하고 public으로 만들었습니다. Method, 저는 어플리케이션이 여러 개 있으므로 api 아래에 common.php에 작성했습니다. 필요에 따라 적절하게 조정하시면 됩니다

먼저 JWT를 소개하고 2개를 작성합니다. 서명 확인 및 확인 토큰을 생성하는 방법. JWT 인증을 사용한 thinkphp6의 자세한 예

<?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;
    }}

jwt를 사용하여 토큰 생성

    /**
     * 使用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;
    }

사용자 컨트롤러 만들기

<?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;
    }}

사용자가 성공적으로 로그인하고 프런트 엔드 토큰을 반환합니다. 프런트 엔드는 토큰을 저장하고 이 토큰을 헤더에 전달합니다. 백엔드에서 토큰을 수락하고 미들웨어에서 확인하세요

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);
    }}

마지막으로 토큰 만료 문제를 해결하는 방법에는 두 가지가 있습니다. 토큰이 만료되지 않도록 토큰 시간이 길어지지만 이는 단점이 있습니다. 클라이언트가 토큰을 얻으면 이는 키를 갖는 것과 동일하며 이니셔티브는 사용자의 손에 있습니다. 따라서 이 솔루션은 권장되지 않습니다. 두 번째는 백엔드 처리입니다. 토큰이 만료되면 토큰이 다시 획득되고 새 토큰이 프런트 엔드에 전달됩니다. 프런트 엔드는 새 토큰을 저장하고 원래 토큰을 대체하며 다음 요청과 함께 새 토큰을 전달합니다. .토큰 요청. 저는 배움과 배움을 좋아하는 프로그래머 Fengfeng입니다.

추천 학습: "

PHP 비디오 튜토리얼

"

위 내용은 JWT 인증을 사용한 thinkphp6의 자세한 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제