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

Posted

技术标签:

【中文标题】使用邮件和密码通过 REST API [Firebase] 进行身份验证【英文标题】:Using mail and password to authenticate via the REST API [Firebase] 【发布时间】:2016-09-16 07:20:18 【问题描述】:

我想知道是否可能使用自定义身份验证真正身份验证到 Firebase REST API >?

我已经与 Firebase 合作了一段时间,目前我正在考虑将我的后端迁移到 Firebase。 使用后端的应用程序当前使用的是 REST API,根本不需要实时数据。 因此,我只想在客户端上使用 REST API 而不是完整的 android 框架。

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

在old docs 中,我只找到了一个自定义登录的解决方案,而在new docs 中,您似乎需要一个 Google 服务帐户。

任何帮助或建议表示赞赏。

【问题讨论】:

旧版 firebase.com 和新版 firebase.google.com SDK 都不允许您通过其 REST API 铸造令牌。您必须设置一个生成令牌的服务器/端点,例如使用受支持的库之一:firebase.google.com/docs/auth/server#create_a_custom_token。 @FrankvanPuffelen 您好,弗兰克,感谢您抽出宝贵时间回答。正如下面的 nloewen 所说,我认为你肯定也会在你的 SDK 中使用 HTTP 请求。所以必须有某种方式,即使它没有得到官方支持。但我也会看看自定义令牌生成,谢谢。 【参考方案1】:

更新:Firebase REST 身份验证现已记录在案!

View the documentation


Firebase REST 身份验证

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

这些 API 未记录且不受支持


Firebase 3

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

Firebase 3 要求所有请求的标头中都包含 Content-Type: application/json

API 密钥

Firebase 3 要求将 API 密钥附加到所有身份验证请求。您可以通过访问 Firebase 项目概述并单击“将 Firebase 添加到您的网络应用程序”来找到您的数据库的 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=&lt;my-firebase-api-key&gt;

有效载荷:


    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

网址:https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=&lt;my-firebase-api-key&gt;

有效载荷:


    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=&lt;my-firebase-api-key&gt;

有效载荷:


    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

【讨论】:

不受支持且可能随时更改,因为这些是内部 API 端点。 @Endzeit 我已经用 Firebase 3 的 REST 身份验证的信息更新了我的答案。这不是身份验证操作的完整列表,但应该让你开始:) 如果你制定出格式其他操作,请回来告诉我们! @makkasi 他们可能不会改变,因为这会破坏旧版本的 SDK。 我能够获得我的 idToken/accessToken,但我不知道如何使用它来访问我的数据库。当我尝试访问 .json?access_token= 时,我的权限被拒绝 这现在是官方的并记录在这里:firebase.google.com/docs/reference/rest/auth/…【参考方案2】:

来自 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;
  // ...
);

【讨论】:

【参考方案3】:

如果您通过 REST API 进行尝试,那么您必须在 您的应用程序 中执行所有操作。

只需获取 json 数据 并检查 您的身份验证与否

使用 retrofit Get 方法 并从您的 firebase 应用程序 中获取所有数据。

这是我的帖子Rerofit + Firebase,我是为初学者发布的,以了解 Firebase 和 Retrofit 的连接。

请浏览此链接,它会对您有所帮助.....................................

REST auth

User Authnitication

Example

享受编码......

【讨论】:

我正在尝试通过 https 发布请求从我的网络应用程序访问 Firebase 数据库,但我收到 403 访问被拒绝。你能看看my question,因为上面的答案都不适合我。我使用 swift + vapor 框架。【参考方案4】:

使用您的电子邮件和密码进行身份验证后,您需要返回令牌,根据文档,您可以返回用户的令牌 getToken(opt_forceRefresh),可从以下 URL 获得。

https://firebase.google.com/docs/reference/js/firebase.User#getToken

【讨论】:

【参考方案5】:

我相信您可以执行以下操作之一:

将您的网络应用连接到 Firebase,您的 REST API 将通过接收用户凭据来处理身份验证,然后通过 web APIs Password Authentication 使用 Firebase 进行身份验证

使用 Firebase 服务器 SDK 生成 custom authentication tokens,令牌将是 JSON Web Token (JWT)

GitHub 上也有生成 Firebase 令牌的项目:

Python php

【讨论】:

是的,我尝试了两种方法,但都不能从 python 中工作。您知道使用这两种方法的任何 python 示例吗?您发布的链接是令牌生成器本身,但我想看一个如何在 python 中使用它的示例。谢谢

以上是关于使用邮件和密码通过 REST API [Firebase] 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Auth REST API - 使用电子邮件/密码登录不会返回刷新令牌

Wordpress REST API - 发送重置密码链接

django rest framework jwt 使用电子邮件和密码进行身份验证

如何通过 HTTP REST API 访问我的 Firebase 数据库?

woocommerce通过rest api验证用户名和密码

使用 WordPress REST API 通过 AJAX 更改密码