Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

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);
        }

    }
mr-hisa-child
自称フルスタックエンジニアです。デザイン(CSS)は苦手ですが、フロントエンドからサーバサイドまで面倒見れます。 Java / SpringBoot / JavaEE / Quarkus / AWS / vuejs / Nuxtjs / AWSソリューションアーキテクトアソシエイト / VSCode / BootStrap / Vuetify / TypeScript
frevoworks
AWSを用いたクラウドアプリケーションの開発・保守を行っています。
https://www.frevo-works.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした