Firebase REST API使用手机号码进行身份验证

17

我正在使用PAW尝试测试部署在Firebase上的不同云函数。该应用程序使用电话验证,但目前几乎没有关于如何通过REST API进行电话号码验证的文档。

根据此处指示,我已经为测试而将手机号加入到白名单中。

看来我需要调用verifyPhoneNumber方法,我已经弄清楚需要的REST API端点格式是:

https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPhoneNumber?key={WEB_API_KEY}

现在我遇到的问题是尝试传递预期的数据。从对应的文档中可以看出,这个端点需要一个phoneNumber和一个applicationVerifier对象。

我尝试发起的请求看起来像这样:

POST /identitytoolkit/v3/relyingparty/verifyPhoneNumber?key={WEB_API_KEY}
Content-Type: application/json; charset=utf-8
Host: www.googleapis.com
Connection: close
User-Agent: Paw/3.1.7 (Macintosh; OS X/10.13.6) GCDHTTPRequest
Content-Length: 73

{"phoneNumber":"+18035551111","applicationVerifier":{"type":"recaptcha"}}

我收到的回应是:

HTTP/1.1 400 Bad Request
Vary: X-Origin
Vary: Referer
Content-Type: application/json; charset=UTF-8
Date: Thu, 13 Sep 2018 16:35:33 GMT
Server: ESF
Cache-Control: private
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
Accept-Ranges: none
Vary: Origin,Accept-Encoding
Connection: close

{
  "error": {
    "code": 400,
    "message": "MISSING_SESSION_INFO",
    "errors": [
      {
        "message": "MISSING_SESSION_INFO",
        "domain": "global",
        "reason": "invalid"
      }
    ]
  }
}

我现在不确定自己做错了什么,因为我已经没有文档可看了,现在只能盲目猜测参数。我该如何通过REST API使用白名单电话号码进行身份验证以进行测试?


你找到解决方案了吗? - mosid
不,我没有。抱歉。 - DjH
为什么你发送了"applicationVerifier":{"type":"recaptcha"}作为请求值?你在哪里找到的这个信息?我只在JavaScript请求中找到了recaptchaToken参数,但无法通过脚本请求获取它。 - koa73
3个回答

17

经过大量研究(我正在努力为“使用手机号登录”的流程创建自动化测试),我终于找到了基于@Danut Pralea的回答的解决方案。 希望它能在未来帮助更多人 :)

考虑到您的电话号码已经被列入白名单(如问题中所述),第一步应该是调用Firebase发送验证码:

POST /v1/accounts:sendVerificationCode?key={WEB_API_KEY} HTTP/1.1
Host: identitytoolkit.googleapis.com:443
Content-Type: application/json
Content-Length: 39

{
    "phoneNumber": "{PHONE_NUMBER}"
}

响应将是sessionInfo,如下所示:

{
    "sessionInfo": "ALiwoWJhYJgtFav1DKc0yBoTwcjjiyQNu240eDJ76GmlH-2i3RmHAYamaPkx3rjEmOBcgrua5QfLw8Nrn_QwjVPO6N09fYsiWQha0-5o2Jb5Hwqxkw7qwsl6YK0gotZ16HmiwqJkyd-stAXTVU1ZIBUwfrFqZmFY7g"
}

接下来的步骤是使用与白名单相同的代码和会话信息在 Firebase 中登录:

POST /v1/accounts:signInWithPhoneNumber?key={WEB_API_KEY} HTTP/1.1
Host: identitytoolkit.googleapis.com:443
Content-Type: application/json
Content-Length: 207

{
    "sessionInfo": "ALiwoWJhYJgtFav1DKc0yBoTwcjjiyQNu240eDJ76GmlH-2i3RmHAYamaPkx3rjEmOBcgrua5QfLw8Nrn_QwjVPO6N09fYsiWQha0-5o2Jb5Hwqxkw7qwsl6YK0gotZ16HmiwqJkyd-stAXTVU1ZIBUwfrFqZmFY7g",
    "code": 123456
}

就是这样!响应将会是类似于:

{
    "idToken": "idToken",
    "refreshToken": "refreshToken",
    "expiresIn": "3600",
    "localId": "localId",
    "isNewUser": false,
    "phoneNumber": "{PHONE_NUMBER}"
}

官方文档中提供了更多信息:https://cloud.google.com/identity-platform/docs/reference/rest/v1/accounts


Firebase提供官方API用于向手机发送验证码(sendVerificationCode)吗? - Manish Vadher
@ManishVadher 是的!https://cloud.google.com/identity-platform/docs/reference/rest/v1/accounts/sendVerificationCode - finx
我想在Firebase的“signInWithPassword”API中获取“unobfuscatedPhoneInfo”值。你能帮我吗?该用户已启用双因素认证。 - Manish Vadher
嗯,我认为我们无法绕过双因素身份验证。不管怎样,我认为你应该为你的问题创建另一个问题@ManishVadher,并添加更多细节,这样我们可以更好地帮助你 :) - finx

5
  1. 创建验证码请求(key是一个环境变量)

发送验证码第一部分 发送验证码第二部分

  1. (可选) 将会话信息设置为Body Response动态值

输入图像描述

  1. 创建验证电话号码的请求

输入图像描述

  1. (同样可选) 将 idToken 也设置为 Body Response 动态值

输入图像描述

  1. 在进行到 Firebase 的后续任何其他请求中使用 idToken 动态值

输入图像描述

使用 Body Response 动态值的最好之处在于可以将它们链接起来并按顺序调用它们:

输入图像描述


我仍然不明白sessioninfo的价值是什么,以及如何获取它?另外,您使用什么工具来生成这个? - mcfred
我正在使用PAW,一款MAC OS的REST客户端。这是与OP使用的相同工具,并且在他的问题描述中也有提到。sessionInfo是Firebase期望用于verifyPhoneNumber调用的参数名称。 - Dani Pralea

2

在REST API的POST请求中,您需要传递reCAPTCHA令牌而不是传递验证码对象。您可以在创建RecaptchaVerifier时的回调函数中获取令牌。

        window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('my_btn', {
            'size': 'invisible',
            'callback': function(response) {
                // reCAPTCHA solved, allow signInWithPhoneNumber.
                recaptchaToken = response;
                .....
            }
        });            

这篇文章对我很有帮助 - https://medium.com/@shangyilim/verifying-phone-numbers-with-firebase-phone-authentication-on-your-backend-for-free-7a9bef326d02

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