はじめに
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からサービスアカウントの秘密鍵情報をダウンロードしておくこと。
手順
環境変数の設定
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);
}
}