【问题标题】:Facing some issues in Flutter REST API using with JWT token在使用 JWT 令牌时面临 Flutter REST API 中的一些问题
【发布时间】:2022-06-28 23:31:50
【问题描述】:

我在使用 JWT 令牌的 Flutter REST API 中遇到了一些问题

此处标头身份验证未正确通过。但它在 Postman 中运行良好

**Example Code:**

    String url = "project URL";
    String token = "generated jwt token";

    var headers = {
      'Authorization': token,
      'Cookie': 'ci_session=u17u9effeqk5fdhl1eqdh4jsmu3o3v29'
    };
    var request = http.Request('GET', Uri.parse(url));

    request.headers.addAll(headers);

    http.StreamedResponse response = await request.send();

    if (response.statusCode == 200) {
      print(await response.stream.bytesToString());
    }
    else {
      print(response.reasonPhrase);
    }

如果我通过在后端删除它来尝试不使用 JWT 令牌,它可以正常工作。但我需要使用 JWT。

谁能帮忙解决这个问题?

【问题讨论】:

    标签: flutter api rest dart jwt


    【解决方案1】:

    我使用 dio 包来处理相同的...

    // Import dio package
    
    Future<void> function() async {
        Dio dio = new Dio();
        String url = 'example.com';
        
         try {
          final response = await dio.post(
            url,
            options: Options(
              headers: {'Authorization': 'Bearer $userToken'}, //This is where you define your header and provide jwt token
            ),
          );
        } on DioError catch (error) {
          if (error.response!.statusCode == 401) {
            print(error.response.toString());
            throw Error();
          }
          print(error);
          throw Error();
        }
      }
    }
    

    包可以在这里找到https://pub.dev/packages/dio

    如有任何疑问,请随时解决

    【讨论】:

    • 感谢新手编码员的回复,但仍然面临同样的问题
    • 您能描述一下您面临的错误吗?您在调试控制台中获得的图片或错误文本
    • 响应仍然显示这样,{"status":false,"message":"Unauthorize token"},但它在邮递员中工作
    【解决方案2】:

    这里最可能的问题是您在标题中给出的值。

    对于不记名令牌,授权标头中给出的值必须是Bearer ,后跟您的令牌值。如果您没有在后端实现某些特定/自制的授权功能,这一定是预期收到的。

    尝试将'Authorization': token,替换为

    'Authorization': `Bearer $token`,
    

    它应该按预期工作。

    【讨论】:

    • 谢谢,但仍然面临同样的问题。
    【解决方案3】:

    该问题导致您的服务器不接受较低的标头名称。是的,http 会将您的标题名称转换为小写,因为http 2.8。并且 dio 在它的包中使用http

    http.dart 文档中:

    除非 [preserveHeaderCase] 设置为 true,否则标题名称将转换为小写。如果两个标头名称在转换为小写时相同,则认为它们是相同的标头,具有一组值。

    如何解决? 确保您的服务器接受小写标题名称,或者您可以按照以下步骤操作:

    1. External Libraries->Dart Packages->dio-4.06->src->adapters->io_adapter.dart 中找到io_adapter.dart
    2. io_adapter.dart中找到此代码
    //Set Headers
    options.headers.forEach((k, v) {
       if (v != null) request.headers.set(k, '$v');
    });
    
    1. 添加preserveHeaderCase: true
    //Set Headers
    options.headers.forEach((k, v) {
       if (v != null) request.headers.set(k, '$v',preserveHeaderCase: true);
    });
    
    1. 清理您的项目并重建

    【讨论】:

      猜你喜欢
      • 2015-05-06
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 2017-11-21
      • 2018-04-26
      • 2016-11-13
      • 2018-02-24
      相关资源
      最近更新 更多