Laravel 5.4 + jwt-auth 1.0 でFirebase のprivatekeyを使ってjwt認証をする
AndroidアプリとAPIを作っていて、Firebaseのカスタム認証を使おうとしています。 APIはLaravel5.4で実装しているけど、FirebaseのAdrminSDKはPHPに対応していないので独自実装が必要です。 Firebaseカスタムトークン認証をするためには、Firebaseから秘密鍵をダウンロードして、サーバに登録します。 今回、サーバに秘密鍵を登録するところで躓いたので、そのときの知見をメモしておきます。
※まだfirebase認証をAndroid側で実装していないので、カスタムトークン認証が正常に動作することは確認できておりません。
開発環境としては、ubuntu 16.04、php 7.1、MySQL5.7 フレームワークはLaravel 5.4 JWT認証ライブラリとして、jwt-auth 1.0を使います。 WebサーバはLaravelの開発サーバを用いています。
まずは、Firebaseから公開鍵(json)をダウンロードします。 jsonの中のprivate_keyが秘密鍵になっているので、コピーします。 秘密鍵を作成します。
$ touch private-key.pem
作成した鍵をvimで開いて、改行コードを改行に変換します。
:%s/\\n/\r/g
秘密鍵のパーミションを600にします。
$ chmod 600 private-key.pem
秘密鍵から公開鍵を作成します。
$ openssl rsa -pubout < private-key.pem > public-key.pem
以上で鍵ファイルの準備は完了です。
今回、公開鍵と秘密鍵はlaravelのアプリケーションルート配下に置きました。
次にconfig/jwt.phpを編集します。
return [ ... 'keys' => [ ... //'public' => env('JWT_PUBLIC_KEY'), 'public' => "file://".base_path("public-key"), //'private' => env('JWT_PRIVATE_KEY'), 'private' => "file://".base_path("private-key.pem"), ... ], ... //'algo' => env('JWT_ALGO', 'HS256'), 'algo' => env('JWT_ALGO', 'RS256'), ... ];
JWTAuthクラスでトークンを生成するときにclaimsが設定可能なようです。
例えば認証のハンドラを用意して、認証が成功した時にuidをclaimsに含めたい場合は以下のような実装になります。
$claims = ['uid' => $user->uid]; return $token = JWTAuth::claims($claims)->fromUser($user);