0

Https Rest APIを使用して、郵便配達員やカールからFirebaseデータベースを直接管理したいと考えています。たとえば、postmanとhttps://MY_FIREBASE_DATABSE_URL/users.jsonを使用してユーザーjsonを返す。パブリックアクセスのセキュリティルールを設定した場合Firebase HTTP POSTのauth引数

{ 
"rules": { 
".read": true, 
".write": true 
} 

これは問題なく動作します。

しかし、私は、認可

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": "auth != null" 
    } 
} 

を必要とするセキュリティルールを設定している場合、私は私の知る限り、私は必要な理解として

{ "エラー" は、 "PERMISSION_DENIED"}

を取得auth = SECURITY_TOKENのhttps要求を追加します。 firebaseコンソールからの秘密鍵を使用する - > SECURITY_TOKENのサービスアカウントは機能しませんが、とにかくデータベースの秘密よりも推奨されていません。

ここでは、https://www.firebase.com/docs/rest/guide/user-auth.html#section-rest-server-authenticationというJavaのトークンジェネレータをダウンロードします。

私はMY_DATABASE_SECRETは、上記のfirebaseコンソールから秘密鍵であり、uidが私のFirebaseユーザーからユーザーIDです言及here

としての私のトークン

public void actionPerformed(ActionEvent e) { 
    String uid = uidField.getText(); 
    boolean admin = adminField.isSelected(); 
    Map<String, Object> authPayload = new HashMap<String, Object>(); 
    authPayload.put("uid", uid); 
    authPayload.put("some", "arbitrary"); 
    authPayload.put("data", "here"); 

    TokenOptions tokenOptions = new TokenOptions(); 
    tokenOptions.setAdmin(admin); 

    TokenGenerator tokenGenerator = new TokenGenerator(<MY_DATABASE_SECRET>); 
    String token = tokenGenerator.createToken(authPayload, tokenOptions); 
    System.out.println(token); 
    tokenField.setText(token); 
} 

を生成するには、次のコードを使用します。このトークンを郵便配達員に使用すると、私は引き続き許可が拒否されます。

+0

あなたがFirebaseのレガシーバージョンのためであるに参照するドキュメントを検索します。プロジェクトは新しいFirebaseコンソールで作成された可能性があります。バージョンを混在させることはできません。新しいバージョンのFirebaseでREST呼び出しを認証する方法については、この回答を参照してください:http://stackoverflow.com/a/37444914/209103 Firebaser Michael Bleigh –

+0

私がその投稿で理解できないこと(そしてそこにはコメントできません)は、「管理アクセスを作成するためにサービスアカウントを直接使用する必要がある」という意味で、node.jsが必要な場合、 Javaとどのように。 –

答えて

0

最後に、ファイアベースのドキュメントを完全に読んだ後、私はそれを理解しました。 REST APIのセキュリティトークンとして使用する必要があるのは、次のコードを使用して、Android用の他のアプリケーション(ios、android、web)でfirebaseにサインインした後に取得できるfirebaseセキュリティトークンIDです。

FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser(); 
    mUser.getToken(true) 
    .addOnCompleteListener(new OnCompleteListener<GetTokenResult>() { 
     public void onComplete(@NonNull Task<GetTokenResult> task) { 
      if (task.isSuccessful()) { 
       String idToken = task.getResult().getToken(); 
       // Send token to your backend via HTTPS 
       // ... 
      } else { 
       // Handle error -> task.getException(); 
      } 
     } 
    }); 

これは、クエリ文字列のauth引数に設定する必要があるトークンです。完全なリファレンスについては

here