Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@mr-hisa-child

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

はじめに

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

    }
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
1
Help us understand the problem. What are the problem?