>  기사  >  PHP 프레임워크  >  ThinkPHP5-think-API를 사용하여 JWT 배포

ThinkPHP5-think-API를 사용하여 JWT 배포

藏色散人
藏色散人앞으로
2019-09-12 10:56:473453검색

다음 프로젝트에서는 TP5를 사용하여 작은 프로그램을 개발할 예정이므로 TP 프레임워크를 사용했습니다. 작은 프로그램을 개발하려면 API 인터페이스를 작성하는 데 필요한 배경 지식이 필요하기 때문에 관련 종속성이 있는지 온라인으로 확인하는 것이 좋습니다. think-api 확장 도구는 미니 프로그램 사용자의 로그인 상태를 확인하기 위해 주로 jwt 기능을 사용하고 싶기 때문에 내 프로젝트를 예로 들어 think-api를 통해 JWT를 배포하는 방법에 대해 간략하게 설명하겠습니다.

1. 종속성 설치

제가 사용하는 TP 버전은 TP5.1, 확장 프로그램 다운로드 주소: https://github.com/czewail/think-api, 작곡가를 통해 종속성 설치:

$ composer require zewail/think-api:1.1.x

2. 참고

확장 기능이 설치된 후 Vendor/think-api/config/jwt.php 파일에서 jwt 구성을 볼 수 있습니다.

주로 수정해야 하는 사용자 모델 경로:

return [
    // 加密算法
    'algorithm'      => 'HS256',
    // HMAC算法使用的加密字符串
    'key'            => 'ex-key',
    // RSA算法使用的私钥文件路径
    'privateKeyPath' => '/home/rsa_private_key.pem',
    // RSA算法使用的公钥文件路径
    'publicKeyPath'  => '/home/rsa_public_key.pem',
    // 误差时间,单位秒
    'deviation'      => 60,
    // 过期时间, 单位分钟
    'ttl'            => 120,
    // 用户模型路径
    'user'           => app\api\model\User::class,
];

3. API 인터페이스 컨트롤러 생성

프론트 엔드에 토큰을 반환하려는 명령줄을 통해 컨트롤러를 생성합니다

$ php thnk make:controller api/Index

4 . 견적 종속성

생성된 파일 헤더에 파일 경로 추가: ZewailApiFacadesJWT 사용; 케이스 코드는 다음과 같습니다.

public function index()
    {
        //获取前台发送过来的登录信息
        $tel      = $this->request->tel;
        $password = $this->request->passwword;
        //把登录信息传入JWT验证匹配
        $credentials = ['tel' => $tel, 'password' => $password];
        //1.验证通过返回token  1和2任意取一种方式
        $token = JWT::attempt($credentials);
        //2.通过已有账户模型生成token  1和2任意取一种方式
        $user  = User::find(84);
        $token = JWT::fromUser($user);
        $msg   = "验证成功";
        //把token发送给前台确认是否成功登陆
        return $this->ApiSuccess($token, $msg);
    }

한 가지 주목해야 할 점은 API의 기본 수신 매개변수가 모바일과 비밀번호라는 점입니다. Door-to-Door 예에서는 전화번호와 비밀번호입니다. 변수 이름이 변경되었으므로 설명하기 위해 사용자 모델에 일부 코드를 삽입해야 합니다. 등.

public $jwtSub = 'tel';

5. 라우팅 구성

在 route/route.php 中加入路由地址 Route::get('api/test', 'api/Index/index');

6. 테스트 실행

백그라운드에서 토큰을 생성하고 로그인 확인을 위해 프런트 데스크에 반환할 수 있도록 테스트 결과는 다음과 같습니다.

ThinkPHP5-think-API를 사용하여 JWT 배포

7. 토큰 확인(보충)

아래 그림의 예시와 같이 토큰 확인을 위해 이전에 생성된 토큰을 postman의 헤더와 함께 백그라운드로 다시 보냅니다.

ThinkPHP5-think-API를 사용하여 JWT 배포

그런 다음 헤더를 가지고 인증 경로에 액세스하세요. 인증 코드는 다음과 같습니다.

       if ($user = JWT::authenticate()) {
                return true;
        }

인증이 정확하면 true가 반환됩니다.

8. 토큰 존재하지 않음 및 토큰 만료 문제 관련(보충)

vendorthink-apisrcJWT/Factoriescode.php 파일에서 think-api 인터페이스는 해당 오류 피드백을 제공합니다.

// 检查是否过期
if (isset($payload->exp) && (time() - $this->deviation) >= $payload->exp) {
    throw new TokenExpiredException('该 Token 已过期');
}
// 验证签名
if (!$this->verify("$header64.$payload64", $signature)) {
    throw new TokenInvalidException('无效的 Token');
}

그러면 이러한 상태 피드백을 어떻게 사용합니까? 이를 위해서는 프런트 엔드 미들웨어를 사용하여 프런트 엔드에서 보낸 토큰 정보를 확인해야 합니다.

먼저 미들웨어를 생성하세요:

$ php think make:middle Test

그런 다음 미들웨어에 다음 내용을 작성하세요:

  //用try catch捕获报错反馈
    public function handle($request, Closure $next)
    {
        try {
            if (!$user = JWT::authenticate()) {
                return response()->json([
                    'errcode' => 1004,
                    'errmsg'  => '无此用户',
                ], 404);
            }
            return $next($request);
        } catch (TokenExpiredException $e) {
            return response()->json([
                'errcode' => 1003,
                'errmsg'  => 'token 过期', //token已过期
            ]);
        } catch (TokenInvalidException $e) {
            return response()->json([
                'errcode' => 1002,
                'errmsg'  => 'token 无效', //token无效
            ]);
        } catch (JWTException $e) {
            return response()->json([
                'errcode' => 1001,
                'errmsg'  => '缺少token', //token为空
            ]);
        }
    }

그런 다음 경로에서 이를 참조하세요.

추천 튜토리얼: thinkphp 튜토리얼

위 내용은 ThinkPHP5-think-API를 사용하여 JWT 배포의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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