php-jwt를 사용하여 인증 된 API를 구현하는 방법

8987 단어 JWTPHPCodeIgniter

php-jwt를 사용하여 인증 된 API를 구현하는 방법



개요



호스트 A에서 호스트 B로의 통신으로 편의 액세스를 방지하기 위해
액세스 키가 있는 프로그램만 실행할 수 있도록 합니다.

php-jwt 도입



php-jwt를 composer로 다운로드
$ composer require firebase/php-jwt

firebase/php-jwt

샘플 코드



샘플은 최근 안건으로 사용하고 있으므로 Codeigniter 베이스🙇‍♂️

JWT_Test.php

JWT::encode로 APP_SECRET_KEY를 사용하여 인코딩
JWT::decode에서 APP_SECRET_KEY를 사용하여 디코딩
use Firebase\JWT\JWT;

const APP_SECRET_KEY = "xxxxxxxxxx";

class JWT_Test
{
    /**
     * APP_SECRET_KEYを使い暗号化を行う
     */
    function encode()
    {
        $payload = array(
            "iss" => "xxx",
            "aud" => "xxx/xxx",
            "iat" => time(),
            "exp" => time() + 3600
        );

        $jwt = JWT::encode($payload, APP_SECRET_KEY);

        return $jwt;
    }

    /**
     * APP_SECRET_KEYを使い復号化を行う
     */
    function decode($jwt)
    {
        $decoded = JWT::decode($jwt, APP_SECRET_KEY, ['HS256']);

        return $decoded;
    }
}

Welcome.php

Guzzle을 사용하여 API 요청을하는 SSL 인증 사이트에 액세스하는 경우,'verify' => FCPATH.'cacert.pem' 필요, cacert.pem
Authorization 헤더에 인코딩 된 token과 함께 액세스
요구처는 Authorization 헤더를 취득 디코드 가능한 경우만 처리를 계속
curl - Extract CA Certs from Mozilla
<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Welcome extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
        $this->load->model('JWT_Test');
    }

    /**
     * 本体側 Guzzleを使いヘッダーにトークン付きリクエストを行う
     */
    public function jwt_request()
    {
        $token = $this->JWT_Test->encode();
        $client = new GuzzleHttp\Client([
            'base_uri' => 'https://xxx.xxx.xxx/',
            'verify' => FCPATH.'cacert.pem'
        ]);
        $headers = [
            'Authorization' => $token,
            'Accept' => 'application/json',
        ];

        $response = $client->request('GET', '/sample-acc/welcome/jwt_request_decode', [
            'headers' => $headers
        ]);

        var_dump($response->getBody()->getContents());
    }

    /**
     * レスポンス側 ヘッダーのトークンが復号化可能な場合に処理を継続
     */
    public function jwt_request_decode()
    {
        $headers = apache_request_headers();
        $token = $headers['Authorization'];

        try {
            $result = $this->JWT_Test->decode($token);
            echo json_encode($result);
        } catch (Exception $e) {
            echo $e->getMessage();
        }
    }
}

좋아! 라고 생각하면 LGTM 부탁합니다

【PR】 주말 하카손이라는 이벤트하고 있습니다! → ㅡㅡㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ 그리고 ysc Rechin. jp/아보 t/

좋은 웹페이지 즐겨찾기