Запрос токена на предъявителя - PullRequest
1 голос
/ 24 сентября 2019

Мне нужно отправить свой токен для моего API.Я сохраняю свой токен в SharedPreferences и могу восстановить это.Мой API нужен с Bearer, но как это сделать?

Я тестировал с Авторизацией, Http и т. Д.

Методы для сохранения в SP

Future<bool> setToken(String value) async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.setString('token', value);
  }

  Future<String> getToken() async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.getString('token');
  }

  Future<Candidate> candidateAuth({Map map}) async {
    String url = 'http://10.0.2.2:3000/v1/api/auth/candidate';
    await http
        .post(url,
            headers: {
              'Content-type': 'application/json',
              'Accept': 'application/json'
            },
            body: jsonEncode(map))
        .then((response) {
      if (response.statusCode == 201) {
        token = Candidate.fromJson(json.decode(response.body)).token;
        Candidate().setToken(token);
        return Candidate.fromJson(json.decode(response.body));
      } else {
        throw Exception('Failed auth');
      }
    });
  }
}

Мой вызов API:


Future<List<Theme>> getThemes() async {
    String url = 'http://10.0.2.2:3000/v1/api/theme';
    String token;
    Candidate().getToken().then((value) {
      token = value;
    });
    final response = await http.get(url, headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json',
      'Authorization': 'Bearer $token',
    });
    print('Token : ${token}');
    print(response);

    if (response.statusCode == 200) {
      List themesList = jsonDecode(response.body);
      List<Theme> themes = [];
      for (var themeMap in themesList) {
        themes.add(Theme.fromJson(themeMap));
      }
      return themes;
    } else {
      throw Exception('Failed to load themes');
    }
  }

Мой возврат APIошибка 401: неавторизован

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Проблема в том, что вы назначаете свой токен другим способом.

Когда вы делаете это await asyncFunction(); Дарт будет ждать, пока он не завершится.Но когда вы делаете это asyncFunction().then((value) => print), это говорит Дарту, что он может продолжить выполнение вашего кода, и когда эта asyncFunction завершена, выведите значение.

Это то, что происходит в вашем случае с

Candidate().getToken().then((value) {
      token = value;
    });

Вот пример, выполните его на Dart Pad.

Future.dart

1 голос
/ 24 сентября 2019

token может не быть установлено к тому времени, когда оно вызывает http.get.Измените его на

    String token = await Candidate().getToken();
    final response = await http.get(url, headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json',
      'Authorization': 'Bearer $token',
    });
    print('Token : ${token}');
    print(response);

, чтобы оно точно было установлено с правильным значением.

...