如何使用 http POST 方法将当前用户(使用应用程序的人)、Firebase Id 令牌从 Flutter 应用程序发送到 restapi?

Posted

技术标签:

【中文标题】如何使用 http POST 方法将当前用户(使用应用程序的人)、Firebase Id 令牌从 Flutter 应用程序发送到 restapi?【英文标题】:How to send current user's(person using the app), Firebase Id token,from the Flutter app, to restapi, using http POST method? 【发布时间】:2020-09-29 19:09:52 【问题描述】:

我创建了一个应用程序,使用 Flutter for UI 和 Nodejs 中的 Restapi 作为后端。现在我想验证注册了firebase身份验证的用户,发送当前用户的firebase Id令牌。为此,我使用 HTTP Post 方法发送 id 令牌。但是出错了。

示例代码:

        import 'package:http/http.dart' as http;

    FirebaseUser user = await FirebaseAuth.instance.currentUser();
       if(user!=null)
  Future<IdTokenResult> idtoken = user.getIdToken();
    
 http.Response response = await http.post("https://www.something.com/something/something",
                              body:jsonEncode(
                                "name": name.text,
                                "pincode": "$pincode",
                                "token": idtoken,
                                "phone": "$widget.phoneNo",
                              ),
                                  headers: 'Content-Type': 'application/json',
                              );

出错了:

     Unhandled Exception: Converting object to an encodable object failed: Instance of 'Future<IdTokenResult>'

P.S:建议编辑,如果问题有问题,我的想法 (提前感谢您的帮助:))

【问题讨论】:

【参考方案1】:

你需要的是 token(String) 而不是 idtoken(IdTokenResult)

import 'package:http/http.dart' as http;

FirebaseUser user = await FirebaseAuth.instance.currentUser();

if(user!=null)
  IdTokenResult idtoken = await user.getIdToken(); 
  // get String token  
  String token = idtoken.token;

 http.Response response = await http.post("https://www.something.com/something/something",
                              body:jsonEncode(
                                "name": name.text,
                                "pincode": "$pincode",
                                "token": token,
                                "phone": "$widget.phoneNo",
                              ),
                                  headers: 'Content-Type': 'application/json',
                              );

【讨论】:

感谢 Taym95 的回答。那么,在其余的 api 方面,firebase-admin sdk 只需要 token 不需要其他参数,如创建时间或过期时间,uid?验证当前用户? 是的,firebase-admin 只需要令牌(字符串),您可以通过将答案投票为正确来感谢我,以便其他人可以从答案中受益!! 我们可以这样回答吗:***.com/a/50295533/13462594【参考方案2】:

我认为问题出在 getIdToken() 部分。

你可以试试下面的代码吗:

FirebaseAuth.instance.currentUser().then(user => 
        if (user != null) 
           user.getIdToken().then(token => 
              http.Response response = await http.post("https://www.something.com/something/something",
                              body:jsonEncode(
                                "name": name.text,
                                "pincode": "$pincode",
                                "token": token,
                                "phone": "$widget.phoneNo",
                              ),
                                  headers: 'Content-Type': 'application/json',
                              );
        
);

【讨论】:

以上是关于如何使用 http POST 方法将当前用户(使用应用程序的人)、Firebase Id 令牌从 Flutter 应用程序发送到 restapi?的主要内容,如果未能解决你的问题,请参考以下文章

php curl如何直接转发当前php接收的headers?get请求如何直接转发get参数?post请求如何直接转发post参数?

如何将 Apigee 的跟踪控制台 HTTP 方法更改为 POST

找出PHP中的HTTP方法[重复]

如何将参数传递给 Express post HTTP 方法?

如何使用 http.post 上传文件和表单数据

使用 POST 方法时的 HTTP 错误