jwt_token.dart 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import 'dart:convert';
  2. import 'dart:io';
  3. import 'package:flutter/foundation.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:telnow_mobile_new/src/injector/injector.dart';
  6. import 'package:telnow_mobile_new/src/layouts/components/template.dart';
  7. import 'package:telnow_mobile_new/src/storage/sharedpreferences/shared_preferences_manager.dart';
  8. import 'package:easy_localization/easy_localization.dart';
  9. import 'package:path_provider/path_provider.dart';
  10. import 'package:telnow_mobile_new/src/utils/U.dart';
  11. import 'package:telnow_mobile_new/src/utils/cache_manager.dart';
  12. import 'api_auth_provider.dart';
  13. class JwtToken{
  14. final SharedPreferencesManager _sharedPreferencesManager = locator<SharedPreferencesManager>();
  15. final ApiAuthProvider _apiAuthProvider = ApiAuthProvider();
  16. Map<String, dynamic> parseJwtPayLoad(String token) {
  17. final parts = token.split('.');
  18. if (parts.length != 3) {
  19. throw Exception('invalid token');
  20. }
  21. final payload = _decodeBase64(parts[1]);
  22. final payloadMap = json.decode(payload);
  23. if (payloadMap is! Map<String, dynamic>) {
  24. throw Exception('invalid payload');
  25. }
  26. return payloadMap;
  27. }
  28. Map<String, dynamic> parseJwtHeader(String token) {
  29. final parts = token.split('.');
  30. if (parts.length != 3) {
  31. throw Exception('invalid token');
  32. }
  33. final payload = _decodeBase64(parts[0]);
  34. final payloadMap = json.decode(payload);
  35. if (payloadMap is! Map<String, dynamic>) {
  36. throw Exception('invalid payload');
  37. }
  38. return payloadMap;
  39. }
  40. String _decodeBase64(String str) {
  41. String output = str.replaceAll('-', '+').replaceAll('_', '/');
  42. switch (output.length % 4) {
  43. case 0:
  44. break;
  45. case 2:
  46. output += '==';
  47. break;
  48. case 3:
  49. output += '=';
  50. break;
  51. default:
  52. throw Exception('Illegal base64url string!"');
  53. }
  54. return utf8.decode(base64Url.decode(output));
  55. }
  56. Future<dynamic> getUserData(BuildContext context) async{
  57. bool isTokenExist = _sharedPreferencesManager.isKeyExists(SharedPreferencesManager.keyAccessToken)!;
  58. String token = _sharedPreferencesManager.getString(SharedPreferencesManager.keyAccessToken)!;
  59. String username = _sharedPreferencesManager.getString(SharedPreferencesManager.keyUsername)!;
  60. if(isTokenExist && token != ''){
  61. var jwt = parseJwtPayLoad(token);
  62. var url = '/api/informants/'+jwt['userId'].toString();
  63. Map<String, dynamic>? user;
  64. if(U.getInternetStatus()){
  65. user = await _apiAuthProvider.getData(url, null, context);
  66. }
  67. else{
  68. var val = await CacheMan.readData(url);
  69. if (val != null) {
  70. user = val['data'][0];
  71. }
  72. }
  73. if((user != null && user['userId'].toLowerCase() != username.toLowerCase())){
  74. U.getChangedPassword() ? handlingError(context, 3) : (){}; //invalid user
  75. return null;
  76. } else if(user != null && user['dateExpired'] != null){
  77. final dateToCheck = DateTime.parse(user['dateExpired']);
  78. final now = DateTime.now();
  79. if(now.isAfter(dateToCheck)){
  80. handlingError(context, 4); //expired
  81. return null;
  82. }
  83. }
  84. if(user != null){
  85. context.setLocale(Locale(user['language'].toLowerCase()));
  86. }
  87. if(U.getInternetStatus()){
  88. CacheMan.writeData(url, [user]);
  89. }
  90. return user;
  91. } else {
  92. U.getChangedPassword() ? handlingError(context, 3) : (){}; //invalid user
  93. return Future.error("not found");
  94. }
  95. }
  96. logout() async{
  97. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keyAccessToken);
  98. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keyRefreshToken);
  99. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keyUsername);
  100. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keyIsLogin);
  101. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keyScoope);
  102. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.debugString);
  103. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keyHistoryMark);
  104. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keyMenuDisplay);
  105. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keyAutoTranslate);
  106. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keyCountRefreshToken);
  107. CacheMan.clearData();
  108. }
  109. // getPath() async{
  110. // var externalDirectoryPath = await ExtStorage.getExternalStorageDirectory();
  111. // return externalDirectoryPath;
  112. // }
  113. getPath() async {
  114. if(!kIsWeb) {
  115. Directory appDocDir = await getApplicationDocumentsDirectory();
  116. return appDocDir.path;
  117. }else{
  118. return null;
  119. }
  120. }
  121. }