使用邮件和密码通过REST API进行身份验证 [Firebase]

53

我想知道是否可以在不使用自定义身份验证的情况下,实际上通过 Firebase REST API 进行身份验证。

我已经使用 Firebase 开发了一段时间,目前考虑将我的后端迁移到 Firebase 上。 使用此后端的应用程序当前使用 REST API,并且根本不需要实时数据。 因此,我想仅使用 REST API,而不是客户端上的完整 Android 框架。

是否可以通过 HTTP 请求使用 Firebase 的邮件和密码身份验证来获取身份验证令牌?

旧文档中,我只找到了使用自定义登录的解决方案,在新文档中,您似乎需要一个 Google 服务帐户。

任何帮助或建议都将受到赞赏。


2
无论是传统的firebase.com还是新的firebase.google.com SDK,都不能通过其REST API生成令牌。您需要设置一个服务器/端点来生成令牌,例如使用支持的库之一:https://firebase.google.com/docs/auth/server#create_a_custom_token。 - Frank van Puffelen
@FrankvanPuffelen 你好Frank,感谢你抽出时间来回答。正如nloewen所说,我自己也认为你肯定在你的SDK中使用了HTTP请求。所以肯定有一些方法,即使它不是官方支持的。 但是我也会研究一下自定义令牌生成,谢谢你。 - Endzeit
5个回答

79

更新:Firebase REST身份验证现已有文档!

查看文档


Firebase REST身份验证

通过检查Javascript API发送的请求,我发现了如何为Firebase执行电子邮件和密码身份验证。

这些API未记录并且不受支持


Firebase 3

Firebase 3身份验证是Google Identity Toolkit的更新和重命名版本。旧的文档不完全准确,但可能会有用,并且可以在此处找到:https://developers.google.com/identity/toolkit/web/reference/

Firebase 3要求所有请求在标头中具有Content-Type: application/json

API密钥

Firebase 3需要将API密钥附加到所有身份验证请求上。您可以通过访问Firebase项目概述并单击“将Firebase添加到您的Web应用程序”来查找数据库的API密钥。您应该会看到类似以下代码的窗口:

<script src="https://www.gstatic.com/firebasejs/live/3.0/firebase.js">    </script>
<script>
  // Initialize Firebase
  var config = {
    apiKey: "<my-firebase-api-key>",
    authDomain: "my-firebase.firebaseapp.com",
    databaseURL: "https://my-firebase.firebaseio.com",
    storageBucket: "my-firebase.appspot.com",
  };
  firebase.initializeApp(config);
</script>

复制apiKey的值并保存以备后用。

注册

方法:POST

网址:https://www.googleapis.com/identitytoolkit/v3/relyingparty/signupNewUser?key=<my-firebase-api-key>

有效载荷:

{
    email: "<email>",
    password: "<password>",
    returnSecureToken: true
}

响应:

{
    "kind": "identitytoolkit#SignupNewUserResponse",
    "localId": "<firebase-user-id>", // Use this to uniquely identify users
    "email": "<email>",
    "displayName": "",
    "idToken": "<provider-id-token>", // Use this as the auth token in database requests
    "registered": true,
    "refreshToken": "<refresh-token>",
    "expiresIn": "3600"
}

登录

请求方式: POST

URL: https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=<my-firebase-api-key>

负载:

{
    email: "<email>",
    password: "<password>",
    returnSecureToken: true
}

响应:

{
    "kind": "identitytoolkit#VerifyPasswordResponse",
    "localId": "<firebase-user-id>", // Use this to uniquely identify users
    "email": "<email>",
    "displayName": "",
    "idToken": "<provider-id-token>", // Use this as the auth token in database requests
    "registered": true,
    "refreshToken": "<refresh-token>",
    "expiresIn": "3600"
}

获取账户信息

方法: POST

网址:https://www.googleapis.com/identitytoolkit/v3/relyingparty/getAccountInfo?key=<我的Firebase API密钥>

负载:

{
    idToken: "<provider-id-token>"
}

响应:

{
    "kind": "identitytoolkit#GetAccountInfoResponse",
    "users": [
    {
        "localId": "<firebase-user-id>",
        "email": "<email>",
        "emailVerified": false,
        "providerUserInfo": [
        {
            "providerId": "<password>",
            "federatedId": "<email>",
            "email": "<email>",
            "rawId": "<email>"
        }],
        "passwordHash": "<hash>",
        "passwordUpdatedAt": 1.465327109E12,
        "validSince": "1465327108",
        "createdAt": "1465327108000"
    }]
}

Firebase 2

这些请求返回的是 Firebase 文档中描述的 JSON 数据。https://www.firebase.com/docs/web/guide/login/password.html#section-logging-in

登录

您可以通过发送以下格式的 GET 请求进行身份验证:

https://auth.firebase.com/v2/<db_name>/auth/password?&email=<email>&password=<password>

注册

用户创建也可以通过发送带有查询字符串 _method=POST 的相同 GET 请求来执行。

https://auth.firebase.com/v2/<db_name>/users?&email=<email>&password=<password>&_method=POST

5
这些是内部API端点,不受支持且可能随时更改。 - Kato
2
@Endzeit 我已经更新了有关Firebase 3的REST认证信息。这不是完整的身份验证操作列表,但应该能够为您提供起点 :) 如果您找到其他操作的格式,请回来告诉我们! - nloewen
3
他们可能不会进行更改,因为那会导致旧版本的SDK出现问题。 - nloewen
2
我能够获取我的idToken/accessToken,但我不知道如何使用它来访问我的数据库。当我尝试访问<database-url>.json?access_token=<access-token>时,我会收到权限被拒绝的错误提示。 - Rontron
4
现在这已经成为官方文件,并已在此处进行了记录:https://firebase.google.com/docs/reference/rest/auth/#section-sign-in-email-password - Gregor
显示剩余10条评论

4

来自Firebase指南:使用自定义身份验证系统在网站上进行Firebase身份验证(请参见https://firebase.google.com/docs/auth/web/custom-auth

通过修改身份验证服务器以在用户成功登录时生成自定义签名令牌,您可以将Firebase身份验证与自定义身份验证系统集成。您的应用程序接收此令牌并使用它来进行Firebase身份验证。

这是关键思想:

1)将Firebase添加到您的Web项目中,并使用Firebase REST JavaScript SDK进行身份验证,并使用Firebase访问存储/实时数据库。

  // TODO: Replace with your project's customized code snippet
  <script src="https://www.gstatic.com/firebasejs/3.0.2/firebase.js"></script>
  <script>
    // Initialize Firebase
    var config = {
      apiKey: '<your-api-key>',
      authDomain: '<your-auth-domain>',
      databaseURL: '<your-database-url>',
      storageBucket: '<your-storage-bucket>'
    };
    firebase.initializeApp(config);
  </script>

2) 您的应用程序用户使用用户名和密码登录您的身份验证服务器。如果凭据有效,您的服务器将返回自定义令牌。

3) 在从身份验证服务器接收到自定义令牌后,将其传递给signInWithCustomToken以登录用户。

firebase.auth().signInWithCustomToken(token).catch(function(error) {
  // Handle Errors here.
  var errorCode = error.code;
  var errorMessage = error.message;
  // ...
});

2
如果你通过REST API尝试操作,那么你需要在你的应用程序中完成所有操作。
只需获取JSON数据并检查您是否已经验证
使用Retrofit Get方法并从firebase应用程序中获取所有数据。
这是我发布的文章Rerofit + Firebase,旨在帮助初学者了解firebase和Retrofit之间的连接。 或者 请查看以下链接,它将对你有所帮助..................... REST身份验证 用户身份验证 示例 享受编码.......

我正在尝试通过https post请求从我的Web应用程序访问Firebase数据库,但是我收到了403访问被拒绝的错误。你能否看一下我的问题,因为上面的答案都对我无效。我使用Swift + Vapor框架。 - bibscy

0

0

我相信你可以做以下其中之一:

  • 将你的 Web 应用连接到 Firebase,你的 REST API 将通过接收用户凭据来处理身份验证,然后通过 Web APIs 密码认证 与 Firebase 进行身份验证。

  • 使用 Firebase 服务器 SDK 生成 自定义身份验证令牌,该令牌将是一个 JSON Web Token (JWT)

还有一些在 GitHub 上生成 Firebase 令牌的项目:


是的,我尝试了这两种方式,但都不能在Python中使用。你知道有没有任何Python示例可以使用其中一种方法吗?你发的链接是令牌生成器本身,但我想看看它在Python中的使用示例。谢谢。 - marciokoko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接