FUMIの開発日記

ソフトウェア開発のメモ的なブログです

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'),
...
];

以上で、秘密鍵を使ってjwtトークンが生成されます。

JWTAuthクラスでトークンを生成するときにclaimsが設定可能なようです。

例えば認証のハンドラを用意して、認証が成功した時にuidをclaimsに含めたい場合は以下のような実装になります。

$claims = ['uid' => $user->uid];
return $token = JWTAuth::claims($claims)->fromUser($user);