邮递员上的授权类型承载令牌,并从API请求数据,这需要具有抖动的令牌承载

问题描述

我试图从我的API请求数据并获取数据,它需要一个承载令牌,可以通过登录获取令牌。作为前端,我创建了一个函数来保存和请求从UI到API。我正在为UI使用Flutter框架。

我设法创建了一个函数来存储登录生成的不记名令牌,从而使用户保持登录状态。它可以通过将不记名令牌保存在sharedpref中来工作。

login() async {
final response = await http.post(
  "https://api.batulimee.com//v1_ship/login_app",body: {"email": email,"password": password},);  
final data = jsonDecode(response.body);
String status = data['status'];
String pesan = data['message'];
String apikey = data['data']['apikey'];
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('apikey',apikey);

if (status == "success") {
  Navigator.of(context).pushReplacement(PageRouteBuilder(
      pageBuilder: (_,__,___) => new bottomNavBar(),transitionDuration: Duration(milliseconds: 600),transitionsBuilder:
          (_,Animation<double> animation,Widget child) {
        return Opacity(
          opacity: animation.value,child: child,);
      }));
  print(pesan);
  print(apikey);
} else {
  print(pesan);
}
}

这是答复。

{
"status": "success","data": {
    "apikey": "UUFmb0w3WlI4Q01qOWRTamgxOFVZRjhIeWhFMkN3T205R20xZXNpYw==","id_user": 50,"id_role": "8","name_role": "Ship Owner","email": "me@gmail.com","phone": "0210201","saldo": "0","photo": "https://cdn.batulimee.com/foto_user/avatar.png"
},"message": "login successfully "
}

,现在我想创建一个可以获取用户配置文件数据的函数,在哪里获取此数据需要我从登录名获得的承载令牌。我需要这样做,以便用户可以在其个人资料中编辑其名称,密码或其他数据并将其保存。

我的后端已创建API get my_profile。我之前已经解释过,要实现这一点,需要一个令牌载体,该令牌载体与我们之前登录时获得的令牌载体相同。现在,我的工作是使用Flutter中的函数获取my_profile数据。

此处来自API的响应获取my_profile。

{
"status": "success","data": {
"id_user": 49,"first_name": "a","last_name": "f","email": "afriansyahm86@gmail.com","phone": "082258785595","company_name": "aa","company_address": "jl kav pgri","photo": "https://batulimee.com/foto_user/avatar.png"
},"message": "get profile detail successfully "
}

enter image description here

如何将承载令牌存储到授权中,以便我可以获取my_profile数据?请帮助我。...:(

解决方法

制作一个api类:

import 'package:http/io_client.dart';
class Api {

  String _token;

 final Client http =IOClient(HttpClient()
    ..badCertificateCallback = _certificateCheck
    ..connectionTimeout = const Duration(seconds: kConnectionTimeoutSeconds));
static bool _certificateCheck(X509Certificate cert,String host,int port) =>
  host.endsWith('EXAMPLE.com'); // Enter your url for api here
  String GetToken() {
    return _token;
  }
Future<bool> setToken(String token) async {
    _token = token;
    return Future.value(true);
  }
Map<String,String> get headers => {
        "Content-Type": "application/json","Accept": "application/json","Authorization": "Bearer $_token",};

}

在您的登录名中使用setToken:

等待_api.setToken(apikey);

接下来是您的个人资料或api类中的任何请求:

Future<ProfileResponse> getProfile() async {
    var url = "$urlPrefix/api/v1/profile";

    var response = await http.get(url,headers: headers);

    if (response.statusCode != 200) {
      print(
          "$response");
      var parsed = json.decode(response.body);
      var message = parsed["message"];
      if (message != null) {
        throw message;
      }

      throw Exception(
          "Request to $url failed with status ${response.statusCode}: ${response.body}");
    }
    // return the response you want 
    return json.decode(response.body);
  }