首页 > 解决方案 > AUTH API REST Firebase Flutter vs POSTMAN

问题描述

我在使用 API REST 和 Android Flutter 的 Firebase 中遇到了一些 AUTH 问题。在 POSTMAN 中工作正常: https ://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=AIzaSyCg8LuhQvn_CFZlNDV0ySK420xxxxxxx-U ..。我有这个 JSON。

{
    "kind": "identitytoolkit#VerifyPasswordResponse",
    "localId": "3GNFGIOFgBUT8BbV5n0vQxxxxxxx",
    "email": "test@test.com",
    "displayName": "",
    "idToken": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjM1MDM0MmIwMjU1MDAyYWI3NWUwNTM0YzU4MmVjYzY2Y2YwZTE3ZDIiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vZmx1dHRlci12YXJpb3MtYjg4NGEiLCJhdWQiOiJmbHV0dGVyLXZhcmlvcy1iODg0YSIsImF1dGhfdGltZSI6MTYzMzQ0NzQ2OSwidXNlcl9pZCI6IjNHTkZHSU9GZ0JVVDhCYlY1bjB2UXN1Q3d0RTMiLCJzdWIiOiIzR05GR0lPRmdCVVQ4QmJWNW4wdlFzdUN3dEUzIiwiaWF0IjoxNjMzNDQ3NDY5LCJleHAiOjE2MzM0NTEwNjksImVtYWlsIjoidGVzdEB0ZXN0LmNvbSIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJlbWFpbCI6WyJ0ZXN0QHRlc3QuY29tIl19LCJzaWduX2luX3Byb3ZpZGVyIjoicGFzc3dvcmQifX0.GBDNfA7nzzJfK35rIf87fQhKtQFAPtyVltXQh0CcDzlbee-zvv-KEFAeNpS0LeQai3id2uJtY9QGEwssq0fYd_Jbob5F5E6ZLTqA7gVVShc7azP2Pu6xxCE6oWvTeW-kfeswNg1TUBGqP8jzlpLAhC__1HAI620s7bH6dqQJ2Ry2YDKUacZvBgFzJ-pMC7V7WcVYclzEEef5Q_c0l-duk8EJ1jhweo4YVJ4qma8WFxO-zWf_PbMLYytn2PjqDC4a9HIxsaiFQxXCwGxezYfBvpczS-c8_xYEp5LCFFI0dYwK4xWcNWgDCN46CjLQAH3uNewVuG97Hpe5O32mi9jM_Q",
    "registered": true,
    "refreshToken": "ACzBnCjCfLugjeNP92J7vqSwJp2jHyB68ztK_MoZBeSZPHzZ21RiH3S5u9hAdIa2E2qh0Z2FZE24b5J3bzTr0sVC9GCxFt-S-VRU4lk2lTpR8FeTcONDwx15IA9NFjr70n-8tG72IpvTNfuyUVyhiseI0xzpmyGv2kujA_gFI6n_P0PGQss3X6A15_582go7BNmCx12YDSEsLZR35YR4h6pQhClvRMvxPg",
    "expiresIn": "3600"
}

并使用“idToken”并将其与 POSTMAN 中的https://flutter-varios-xxxxxxxxxxxxxxxx.firebaseio.com/product/.json?auth=[idToken]一起使用可以正常工作。

在使用 http: ^0.13.4 (dependencies) 的 Flutter 中,我可以唱歌并且我有 JSON,但 [idToken] 比使用 POSTMAN 的 POST 小(以字节为单位)。idToken 的大小是 921 vs 678 (Flutter http.post),不知道为什么:

login(String email, String password) async {
    final authData = {
      "email": email,
      "password": password,
      "returnSecureToke": true
    };
    final resp = await http.post(
        Uri.parse(
            'https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=$_firebaseToken'),
        body: json.encode(authData));
    Map<String, dynamic> decodeResp = json.decode(resp.body);

    //print('Decode Resp: ${decodeResp}');

    if (decodeResp.containsKey('idToken')) {
      print('ID Token: ${decodeResp['idToken']}');
      _prefs.token = decodeResp['idToken'];
      return {'ok': true, 'token': decodeResp['idToken']};
    } else {
      return {'ok': false, 'msj': decodeResp['error']['message']};
    }
  }

and with this [idToken] I use for make the URL https://flutter-varios-xxxxxxxxxxxxxxxx.firebaseio.com/product/.json?auth=eyJhbGciOiJSUzI1NiIsImtpZCI6InRCME0yQSJ9.eyJpc3MiOiJodHRwczovL2lkZW50aXR5dG9vbGtpdC5nb29nbGUuY29tLyIsImF1ZCI6ImZsdXR0ZXItdmFyaW9zLWI4ODRhIiwiaWF0IjoxNjMzNDQ3OTIxLCJleHAiOjE2MzQ2NTc1MjEsInVzZXJfaWQiOiIzR05GR0lPRmdCVVQ4QmJWNW4wdlFzdUN3dEUzIiwiZW1haWwiOiJ0ZXN0QHRlc3QuY29tIiwic2lnbl9pbl9wcm92aWRlciI6InBhc3N3b3JkIiwidmVyaWZpZWQiOmZhbHNlfQ.Vnfo6Mo7gI4DKpJXXNBVeKAQWiA4brnRrxpDJ3B_hb6AsdGkOA3qQXLKsyh3CkyPIoN-_mzodZfOXyBr-hIORORhZ4QBY1uRsXuzLUj0CaHO3xtOgXyO-n9vH4nU29QOKNVgay8wo5TsZi91dNeQrXHyQMUHAd9Z8vVM25uX6TB7n5rIVGX1Odo_c7gPcooX2wcCbfOuOGr4P1D01WkffqEOQCUQzSleezIIixbU95YSGi09cWQroDbIGSMUfIcnGRfEOjcwfKQZFYUetS7O1zQjqREYujAQMQ3YLXKPBEREeT-_O9XINhk_fB1YV1XGqoeSeDpn1IP5n_H1ez854A

在我使用的 Firebase 实时数据库中(没有 auth 过滤器,当然一切正常)

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

因此,当 idToken 不正确时,我无法访问数据库。如果您有任何建议,请告诉我,我将不胜感激

标签: firebaseflutterapiauthentication

解决方案


您对对象的定义有一个错误authData:您有一个键returnSecureToke(没有n)而不是returnSecureToken


推荐阅读