LoginSignup
6
2

More than 5 years have passed since last update.

JavaでFirebaseAdminSDKを使う際に認証ファイルを用意せずに利用する

Last updated at Posted at 2019-03-26

はじめに

JavaでFirebase Admin SDKを利用する場合、下記のようにFirebaseを初期化する必要があります。

初期化
FileInputStream serviceAccount = new FileInputStream("path/to/serviceAccountKey.json");

FirebaseOptions options = new FirebaseOptions.Builder()
    .setCredentials(GoogleCredentials.fromStream(serviceAccount))
    .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
    .build();

FirebaseApp.initializeApp(options);

ここで問題なのが、Firebase Consoleからダウンロードしたjsonファイルを読み込む必要があるということ。
通常、機密情報などは環境変数で渡すのが一般的だが、なぜか機密情報が記述されたjsonファイルが必要。

例えば、Ci/CDなどで、GitHubへプッシュをトリガーにサーバへデプロイする場合、
このjsonファイルもプッシュする必要があります。
リポジトリがプライベートだとしても、管理するのは危険ですよね。

というわけで、お題にもある通り、ファイルを用意せずに環境変数から設定する方法をご紹介します。

動作環境

  • Mac OS Mojave
  • Visual Studio Code
  • Java 8
  • Spring Boot 2

準備

Firebase Consoleからサービスアカウントの秘密鍵情報をダウンロードしておくこと。

スクリーンショット_2019-03-26_23_20_11.png

手順

環境変数の設定

launch.jsonに以下のコードを追加します。
設定値は秘密鍵情報のjsonファイルを参照してください。

launch.json
"env": {
        "TYPE": "<type>",
        "PROJECT_ID": "<project_id>",
        "PRIVATE_KEY": "<private_key>",
        "PRIVATE_KEY_ID": "<private_key_id>",
        "CLIENT_EMAIL": "<client_email>",
        "CLIENT_ID": "<client_id>",
        "CLIENT_X509_CERT_URL": "<client_x509_cert_url>"
}

実装

プログラムでjsonファイルを作ってしまえばよい。

@SpringBootApplication
public class DemoApplication {

    private static final String FIREBASE_CREDENTIALS_PATH = "/path/to/credentials.json";
    private static ObjectMapper mapper = new ObjectMapper();

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
        try {
            FileWriter fw = new FileWriter(FIREBASE_CREDENTIALS_PATH);
            try (PrintWriter pw = new PrintWriter(new BufferedWriter(fw))) {
                // 環境変数から取得して設定する
                Map<String, String> credentials = new HashMap<>();
                credentials.put("type", System.getenv("TYPE"));
                credentials.put("project_id", System.getenv("PROJECT_ID"));
                credentials.put("private_key_id", System.getenv("PRIVATE_KEY_ID"));
                credentials.put("private_key", System.getenv("PRIVATE_KEY"));
                credentials.put("client_email", System.getenv("CLIENT_EMAIL"));
                credentials.put("client_id", System.getenv("CLIENT_ID"));
                credentials.put("auth_uri", "https://accounts.google.com/o/oauth2/auth");
                credentials.put("token_uri", "https://oauth2.googleapis.com/token");
                credentials.put("auth_provider_x509_cert_url", "https://www.googleapis.com/oauth2/v1/certs");
                credentials.put("client_x509_cert_url", System.getenv("CLIENT_X509_CERT_URL"));
                // MapをJson形式の文字列に変換
                String str = mapper.writeValueAsString(credentials);
                // ファイルに書き込み
                pw.println(str);
            }
            FileInputStream serviceAccount = new FileInputStream(FIREBASE_CREDENTIALS_PATH);

            FirebaseOptions options = new FirebaseOptions.Builder()
                    .setCredentials(GoogleCredentials.fromStream(serviceAccount)).build();
            // 初期化
            FirebaseApp.initializeApp(options);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2