LINE WORKSのJWT認証をPHPで通してみる


ちょっと仕事でLINE WORKSの認証を通す必要があったのですが、
composerでjwtライブラリを入れて認証するものが多かったのでピュアPHPで入れるとこうなるって
ものを書いてみた

<?php
/**
 * @property strign rsa_key プライベートキー(実際はセキュアな場所におかないとだめ)
 */
$rsa_key = "-----BEGIN PRIVATE KEY-----
[ここは発行されたプライベートキーを入れる]
-----END PRIVATE KEY-----";

/**
 * @property strign server_id サーバーID
 */
$server_id = "[ここも発行されているサーバーIDを入れる]";

//Header作成
$header = '{"alg":"RS256","typ":"JWT"}';
$header = base64_encode($header);
//URLSafeな形で置換
$header = str_replace(array('+', '/', '='), array('-', '_', ''), $header);

//body作成 issはサーバーID
$body = '{"iss":"%s","iat":%s,"exp":%s}';
//生成は現在時刻、満了は30分後に設定
$body = sprintf($body, $server_id, time(), time() + 1800);
$body = base64_encode($body);
$body = str_replace(array('+', '/', '='), array('-', '_', ''), $body);

//headerとbodyをつなげたもの
$sha_hash = $header . "." . $body;

//電子認証を行うアルゴリズムはSHA256にしないといけない
openssl_sign($sha_hash, $encrypted, $rsa_key, OPENSSL_ALGO_SHA256);
$signature = base64_encode($encrypted);
$signature = str_replace(array('+', '/', '='), array('-', '_', ''), $signature);

//JWT生成
echo $header . "." . $body . "." . $signature;

このJWTを使ってPOSTmanで認証通してみると

こんな感じで200OKが帰ってきて成功する
本来はライブラリでやるんでしょうけど、それが諸々の理由でできない人はこんな感じで認証できるよという話でした