php Bearer認証についてメモ

APIの認証にBearer認証ってのがあって…諸々メモ

作成日:2024-01-09, 更新日:2024-01-10

基本

  • 「Bearer トークン」という形でセットする
    ※「Bearer」というワードはプログラム的には関係なく開発者の可読性・共通認識…そこいらの理由で使うっぽい
  • JWTっていうライブラリがあるのでそれを使うのが無難
    ※自前で頑張るってのもアリ

流れ

API側の流れ

トークンを作成するAPI

  1. リクエストからユーザーIDやパスワード、その他の情報を抜き出す
  2. ユーザーIDやパスワード、その他の情報からトークンを作成
  3. トークンを出力

他のAPI

  1. リクエストからトークンを抜き出す
  2. トークンをチェックして問題無ければエンドポイントに合わせた内容を出力

API側じゃなくて、APIを利用したい人の流れ

  1. トークンを取得
  2. トークンをセットして、APIを実行

PHP-JWTをベースにしたメモ

PHP-JWTを使う前提でのメモ

アクセストークン、リフレッシュトークン

「JWT::encode()」で作成可能

通常はアクセストークンに有効期限をセットし、リフレッシュトークンを使いアクセストークンを再生成…らしい

▼「exp」があると有効期限がセットされる。無ければ無期限

$key = 'secret_key';
$alg = 'HS256';
$payload = array(
	'user_id' => 123,
	'exp' => time() + 3600,
);
$token = JWT::encode($payload, $key, $alg);

トークンのチェック

「JWT::decode()」で有効期限のチェックもしてくれるっぽい

$token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

try {
	$keyOrKeyArray = new Key(
		秘密鍵,
		'HS256',
	);
	$decoded_std = JWT::decode($token, $keyOrKeyArray);
	$decoded_ary = json_decode(json_encode($decoded_std), true); // stdClassを配列に変換しておく

	// トークンが正当である場合の処理

}
catch (\Firebase\JWT\ExpiredException $e) { // トークンが期限切れ
	echo $e->getMessage();
}
catch (\Firebase\JWT\SignatureInvalidException $e) { // 署名が無効。トークンを書き替えられた?
	echo $e->getMessage();
}
catch (\Exception $e) { // その他の例外
	echo $e->getMessage();
}

シークレットキーの作成

決め打ちで作り替えない…ってのがラクだけどセキュリティ的にダメ

▼予測が難しい文字列(※下記だと「random_bytes(32)」ってトコ)を使うのが推奨

$secret_key = hash('sha256', random_bytes(32));

クライアント側

トークンをデコード

APIを叩く側…でトークンをデコードするコトは可能

▼Javascriptでトークンをデコード

const token = 'your_jwt_token';
const decodedToken = JSON.parse(atob(token.split('.')[1]));

セキュリティ的に問題無いの?と思い調べるとペイロード部分のみデコードするから問題無いらしい