Я получаю сообщение «Неаутентифицировано» с действительным токеном в Laravel Passport с использованием Flutter - PullRequest
0 голосов
/ 06 января 2020

Я создал веб-сервис, используя Laravel Паспорт для аутентификации. Когда я регистрирую пользователя, он успешно генерирует токен доступа, но когда я пытаюсь получить информацию о пользователе, я не аутентифицируюсь.

Интересно то, что создание социальной регистрации с помощью Postman, сгенерированного токена доступа, работает, но когда я регистрируюсь с приложением, токен доступа недействителен.

Это мой код запроса на моем мобильное приложение:

Future<Map> socialSignIn(UserSocialAuth userSocialAuth) async {
    final String _socialPath = '/social_auth';
    Future<Map> socialSignInResponse;
    try {
      socialSignInResponse = postRequest(_socialPath, userSocialAuth.toJson());
    } catch (error, stackTrace) {
      print("Exception ocurred: $error  stackTrace: $stackTrace");
      socialSignInResponse = jsonDecode('{"exception": $error, "stackTrace": $stackTrace}');
    }
    return socialSignInResponse;
}

/// POST Request
Future<Map> postRequest(String serviceName, Map data) async {
    Map responseData = {};
    FormData formData = FormData.fromMap(data);
    _dio.options.connectTimeout = connectTimeout;
    _dio.options.receiveTimeout = receiveTimeout;
    try {
      Response response = await _dio.post(
        _endpoint + '$serviceName',
        data: formData,
        options: Options(
          headers: {
            'Authorization': await getAccessToken(),
            'Accept': 'application/json'
          }
        )
      );
      if (response.statusCode == 200) {
        responseData = response.data;
      }
    } catch (e) {
      // An error was received
      responseData = {
        'error': 'No se pudo conectar con el servidor de $_appName',
        'exception': e.toString()
      };
    }
    return responseData;
}

А это запрос пользовательских данных с использованием токена доступа:

Future<Map> currentUser(String accessToken) async {
    final String _currentUserPath = '/user';
    Future<Map> userDataResponse;
    try {
      userDataResponse = getRequest(_currentUserPath);
    } catch (error, stackTrace) {
      print("Exception ocurred: $error  stackTrace: $stackTrace");
      userDataResponse = jsonDecode('{"exception": $error, "stackTrace": $stackTrace}');
    }
    return userDataResponse;
  }

/// GET Request
Future<Map> getRequest(String serviceName) async {
    Map responseData = {};
    _dio.options.connectTimeout = connectTimeout;
    _dio.options.receiveTimeout = receiveTimeout;
    try {
      Response response = await _dio.get(
        _endpoint + '$serviceName',
        options: Options(
          headers: {
            'Authorization': await getAccessToken(),
            'Accept': 'application/json'
          }
        ));

      if (response.statusCode == 200) {
        responseData = response.data;
      }
    } catch (e) {
      // An error was received
      responseData = {
        'error': 'No se pudo conectar con el servidor de $_appName',
        'exception': e.toString()
      };
    }
    return responseData;
}

Я не знаю, почему работает с почтальоном, а не с приложением.

Я сохраняю токен доступа с SharedPreferences следующим образом:

/// ----------------------------------------------------------
/// Method that returns the token from Shared Preferences
/// ----------------------------------------------------------
Future<SharedPreferences> _prefs = SharedPreferences.getInstance();

Future<String> getAccessToken() async {
    final SharedPreferences prefs = await _prefs;
    String _authorizationToken;

    if (prefs.getString(_accessTokenKey) != null) {
      _authorizationToken = 'Bearer ' + prefs.getString(_accessTokenKey);
    }

    return _authorizationToken;
  }

/// ----------------------------------------------------------
/// Method that saves the token in Shared Preferences
/// ----------------------------------------------------------
Future<bool> setAccessToken(String token) async {
    final SharedPreferences prefs = await _prefs;

    return prefs.setString(_accessTokenKey, token);
}
...