如何在 Firebase 中为社交登录创建包装器 REST API?

How to create wrapper REST API for social login in Firebase?

我正在尝试使用云函数为 Firebase 身份验证创建包装器 REST API。

一旦我在客户端上拥有 Facebook 访问令牌(使用 Facebook SDK),我如何才能在 Firebase 上创建用户验证用户

如果您将 Firebase Functions 与 HTTP 触发器一起使用,则可以使用 firebase.js 客户端 node.js 库对用户进行身份验证,并 return 您的 REST API 中的 Firbease 令牌].您可以将 Facebook 访问令牌发送到该 HTTP 端点,使用 node.js 客户端库和 return ID 令牌和刷新令牌通过 signInWithCredential 登录用户。

如果您想使用 REST API:

curl 'https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyAssertion?key=[API_KEY]' \
-H 'Content-Type: application/json' \
--data-binary '{"postBody":"access_token=[FACEBOOK_ACCESS_TOKEN]&providerId=[facebook.com]","requestUri":"[http://localhost]","returnIdpCredential":true,"returnSecureToken":true}'

这将 return Firebase ID 令牌和刷新令牌:

{
  "idToken": "[ID_TOKEN]",
  "refreshToken": "[REFRESH_TOKEN]",
  ...
}

这就是 Firebase 身份验证会话所需的全部内容。

要构造用户,请使用 ID 令牌调用以下 API:

curl 'https://www.googleapis.com/identitytoolkit/v3/relyingparty/getAccountInfo?key=[API_KEY]' \
-H 'Content-Type: application/json' --data-binary '{"idToken":"[FIREBASE_ID_TOKEN]"}'

这将 return 用户和相关数据:

{
  "kind": "identitytoolkit#GetAccountInfoResponse",
  "users": [
    {
      "localId": "ZY1rJK0...",
      "email": "user@example.com",
      "emailVerified": false,
      "displayName": "John Doe",
      "providerUserInfo": [
        {
          "providerId": "password",
          "displayName": "John Doe",
          "photoUrl": "http://localhost:8080/img1234567890/photo.png",
          "federatedId": "user@example.com",
          "email": "user@example.com",
          "rawId": "user@example.com",
          "screenName": "user@example.com"
        }
      ],
      "photoUrl": "https://lh5.googleusercontent.com/.../photo.jpg",
      "passwordHash": "...",
      "passwordUpdatedAt": 1.484124177E12,
      "validSince": "1484124177",
      "disabled": false,
      "lastLoginAt": "1484628946000",
      "createdAt": "1484124142000",
      "customAuth": false
    }
  ]
}

要在 ID 令牌过期后刷新它,请使用刷新令牌 returned: 使用 REST API:

curl 'https://securetoken.googleapis.com/v1/token?key=[API_KEY]' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data 'grant_type=refresh_token&refresh_token=[REFRESH_TOKEN]'

这将 return 一个新的 ID 令牌和刷新令牌:

{
  "expires_in": "3600",
  "token_type": "Bearer",
  "refresh_token": "[REFRESH_TOKEN]",
  "id_token": "[ID_TOKEN]",
  "user_id": "tRcfmLH7o2XrNELi...",
  "project_id": "1234567890"
}

要将其与后端的客户端库一起使用: var firebase = require('firebase');

您将 FB 访问令牌从客户端发送到您的 HTTP 端点并使用它登录:

var cred = firebase.auth.FacebookAuthProvider.credential(fbAccessToken);
firebase.auth().signInWithCredential(cred).then(function(user) {
  // User is obtained here.
  // To get refresh token:
  // user.refreshToken
  // To get ID token:
  return user.getIdToken().then(function(idToken) {
    // ...
  })
}).catch(function(error) {
});