How to dynamically save token after logging to shared prefernces

Viewed 38

How to dynamically auth users and save tokens in shared pref?

I understood how to save token in sharedprefernces, but can't understand how to take it dynamically by login/password and pass token from it to sharedpref dynamically in loginWithToken(); beacuse I use this function for auth in

final httpConnectionOptions = HttpConnectionOptions(
        accessTokenFactory: () => SharedPreferenceService().loginWithToken(),

and it is required only String

My code now is like that:

Here is request where I am making request to get token:

 Future<String?> getToken(String password, String login) async {
    String _email = "admin";
    String _password = "123";
    Map<String, String> headers = {
      'Content-Type': 'application/json',
      'accept': ' */*'
    };
    final body = {
      'username': _email,
      'password': _password,
    };
    var response = await http.post(
      Uri.parse("http://mylink/login"),
      headers: headers,
      body: jsonEncode(body),
    );
    if (response.statusCode == 200) {
      var value = jsonEncode(response.body);
      return value;
    }
    return null;
  } 

here is I created logging logic:

 final TextEditingController _loginController = TextEditingController();
  final TextEditingController _passwordController = TextEditingController();

 ElevatedButton(
                                onPressed: () async {
                                  var username = _loginController.text;
                                  var password = _passwordController.text;
                                  var jwt = await ProviderService()
                                      .getToken(password, username);
                                  if (jwt != null) {
                                    SharedPreferenceService().setToken(jwt);
                                    Navigator.pushNamed(
                                        context, '/mainPageAdmin');
                                  } else {
                                    displayDialog(context);
                                  }
                                },

here is my shared pref. I can't understand how to put new token value in that string, after paaword and login was sent.

 String tokens = 'dhjwhdwdwkjdhdkje';
 
  Future<bool> getSharedPreferencesInstance() async {
    _prefs = await SharedPreferences.getInstance().catchError((e) {
      print("shared preferences error : $e");
      return false;
    });
    return true;
  }

  Future setToken(String token) async {
    await _prefs?.setString('token', token);
  }

  Future clearToken() async {
    await _prefs?.clear();
  }

  Future<String> get token async => _prefs?.getString('token') ?? '';

  Future<String> loginWithToken() async {
    bool value = await getSharedPreferencesInstance();
    if (value == true) {
      setToken("Bearer $tokens");
      //   print(tokens);
    }
    return tokens;
  }

Api Responce:

{
  "$id": "1",
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZ",
  "user": {
    "$id": "2"
  }
}

Auth class I parsed:

Auth authFromJson(String str) => Auth.fromJson(json.decode(str));

String authToJson(Auth data) => json.encode(data.toJson());

    class Auth {
      Auth({
        this.token,
        this.user,
      });
    
      final String? token;
      final User? user;
    
      factory Auth.fromJson(Map<String, dynamic> json) => Auth(
            token: json["token"],
            user: User.fromJson(json["user"]),
          );
    
      Map<String, dynamic> toJson() => {
            "token": token,
            "user": user!.toJson(),
          };
    }
1 Answers

In your getToken function do this:

if (response.statusCode == 200) {
      var value = jsonEncode(response.body) as Map<String, dynamic>;
      await setToken(value['token']);
      return value;
    }
Related