php-jwtを使って認証付きAPIの実装方法
概要
ホストAからホストBへの通信で勝手アクセスを防ぐため
アクセスキーを持つプログラムだけが実行できるようにする。
php-jwt導入
php-jwtをcomposerを使いダウンロード
$ composer require 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】週末ハッカソンというイベントやってます! → https://weekend-hackathon.toyscreation.jp/about/