web-dev-qa-db-ja.com

Firebase Auth Tokenをクライアントからサーバーに渡す方法は?

私が取り組んでいるウェブサイトはFirebase認証を使用しており、ログインするユーザーごとに、アクセスできるページに関する権限が異なります。

サインインの設定方法は次のようになります post

  1. ユーザーは「id」と「email」の2つのパラメーターでログインします
  2. サーバーはこれらを使用してカスタム「uid」を作成し、Firebase AdminSDKを使用してカスタムトークンを作成してクライアントに送り返します。
  3. クライアントは、Javascript Firebase SDKを使用してログインします-firebase.auth()。signInWithCustomToken()
  4. ユーザーがログインしたので、さまざまなページをクリックできます。つまり、「/ foo」、「/ bar」です。

私が直面している問題は、彼らが新しいページにアクセスしたときに、トークンをクライアントからサーバーに戻そうとしていることです(これで行われた方法とほぼ同じです Firebase Doc )、トークンを確認し、ウェブページを表示する権限があるかどうかを確認します。

私はこれを行うための最良の(そして最も安全な)方法を見つけようとしています。私は次のオプションを検討しました:

  • トークンを使用してURLを作成しますが、トークンが公開され、セッションハイジャックがはるかに簡単になるため、これは適切な方法ではないと聞きました。

私はリクエストヘッダーでトークンを渡そうとしていますが、私の理解では、ユーザーが別のページへのリンクをクリックしたとき(またはJavaScriptでリダイレクトされた場合)にヘッダーを追加することはできません。同じ問題がPOSTの使用にも当てはまります。

この情報をサーバーに安全に渡し、ユーザーが別のページへのリンクをクリックしたときにアクセス許可を確認するにはどうすればよいですか?

15
wolverine239

次の方法で、クライアント側でaccessToken(idToken)を取得できます。

var accessToken = null;

firebase.auth().currentUser
    .getIdToken()
    .then(function (token) {
        accessToken = token;
    });

リクエストヘッダーに渡します。

request.headers['Authorization'] = 'Bearer ' + accessToken;

サーバー側では、好みの方法でトークンを取得し、(Node.js)のようなFirebase AdminSDKでリクエストを認証します。

firebaseAdmin.auth()
    .verifyIdToken(accessToken)
    .then(decodedIdToken => {
        return firebaseAdmin.auth().getUser(decodedIdToken.uid);
    })
    .then(user => {
        // Do whatever you want with the user.
    });
9
mehyaa