如何在Flutter移动应用中的API调用中传递基本身份验证凭据?

52

我正在开发一个简单的Flutter移动应用程序,需要调用一个使用基本身份验证的API。

我可以在Postman中使用电子邮件和密码凭据访问API,并且在执行请求之前对电子邮件和密码进行Base64编码(我假设用“:”分隔符)。

我不确定如何在Flutter/Dart中实现这一点...

我尝试了http包并尝试进行Base64编码...但是我仅从服务器获得错误。

有人能提供基本身份验证请求的指导或示例吗?

2个回答

139

假设您的服务器期望用户名:密码组合将被编码为UTF-8(有关更多详细信息,请参见RFC 7617),那么请使用以下代码:

import 'dart:convert';
    
import 'package:http/http.dart';
    
main() async {
  String username = 'test';
  String password = '123£';
  String basicAuth =
      'Basic ' + base64.encode(utf8.encode('$username:$password'));
  print(basicAuth);
    
  Response r = await get(Uri.parse('https://api.somewhere.io'),
      headers: <String, String>{'authorization': basicAuth});
  print(r.statusCode);
  print(r.body);
}

1
太好了!我可以拼凑出http的各个部分,但是不知道如何构建头文件。刚刚测试了一下,完美地运行了。 - Eric Wilhite
如果需要头部,您可以使用HTTP POST方式发送请求,例如:最终的登录响应为:await client.post(loginUrl, body: json.encode(user), headers: header); - Shyju M
1
你好,我想使用oAuth1而不是basic,因为我不在HTTPS上,我在HTTP上,有什么建议吗? - Rajesh Vishnani
预构建Header-map需要Map中的强类型:https://medium.com/@hagenverfolgt/basic-http-auth-with-flutter-the-right-way-e5209cbe4b55 - itinance
1
在我的情况下,这会导致一个永远挂起的请求。有什么想法为什么会这样? - Jones
我有一个问题,如果请求包含额外的参数,例如域名,在这种情况下应该添加什么?不知道它是否需要在头文件中进行修改以及如何编写?提前致谢。 - Mona

22

我知道现在已经很晚了,但如果这篇文章能够帮助其他人,我还是想发布出来。

import 'dart:convert';

var auth = 'Basic '+base64Encode(utf8.encode('$username:$password'));

Future<Response> callAPI(param) async {
    await dio.post('/api/test',
        data: {'param': param},
        options: Options(headers: <String, String>{'authorization': auth})); 
  }

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