Авторизация с помощью Bearer Token


#1

Задача состоит в том что бы получить текст с сервера. Для получения текста есть ендпоин с обязательной авторизацией пользователя через bearer token в шапке запроса. Через программу Postman все получается, а вот программно не как не могу авторизоваться. В документации указан пример шапки запроса “Authorization : Bearer <access_token>”.
Вот код моего запроса

  guard let url = URL(string: "https://*********/api/get/text") else {return}
    var request  = URLRequest(url: url)
    let sessionConfiguration = URLSessionConfiguration.default
    let session = URLSession(configuration: sessionConfiguration)
    request.httpMethod = "GET"
    request.addValue("Bearer GqvKi5RWYjdGpH64MHB8McgKe2_UU-Hq", forHTTPHeaderField: "Authorization")
    session.dataTask(with: request) { (data, response, error) in
        if let response = response{
            print(response)
        }

        guard let data = data else {return}
        do {
            let json = try JSONSerialization.jsonObject(with: data, options: [])
            print(json)
        } catch{
            print(error)
        }
        }.resume()

Подскажите пожалуйста, где ошибка или как правильно передать токен серверу.


#2

на этот вопрос есть много ответов на просторах интернета
Например тут


#3

Да вот перепробовал все, что нашел в интернете и такой метод тоже пробывал. Не получилось(


#4

Для начала, сам запрос у вас уходит к серверу? Что у вас получается после запроса, что возвращается?
И на всякий случай: вы доступ приложению дали для отправки запросов?


#5

Запрос уходит, а в ответ приходит ошибка авторизации

 { Status Code: 401, Headers {
"Content-Type" =     (
    "application/json; charset=UTF-8"
);
Date =     (
    "Tue, 28 Aug 2018 12:08:33 GMT"
);
Server =     (
    nginx
);} }{
data =     {
};
errors =     (
            {
        code = 0;
        message = "Your request was made with invalid credentials.";
        name = Unauthorized;
        status = 401;
    }
);
success = 0;}

Можно по подробней про доступ приложению дали для отправки запросов


#6

Если запрос уходит, то все ок.
“Your request was made with invalid credentials.” - это имеется в виду логин/пароль или хедеры?

P.S. пардон, это же не авторизация.
Кстати, авторизация у вас проходит? Или вы токен в ручную вставили?

P.S.S. не знаю как в вашем API, но в большинстве случаев еще и client ID требуется отправлять. У вас может быть тоже нужен?


#7

Зачем? (двадцать символов)


#8

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


#9

Здравствуйте! Что в итоге у вас получилось? Я тоже не могу авторизоваться через Bearer токен. Если вы уже решили эту задачу не могли бы вы поделиться? У меня такая странная ситуация, если с помощью приложение попытаться распарсить ссылку в консоли XCode получаю
{

“code”: 401,

“detail”: “required authorization token not found”,

“id”: “JWT_ERROR”

},
decodingError

а если же в POSTMAN отправляю запрос на эту же ссылку то без проблем получаю JSON
в POSTMAN, и после этого еще раз попытаюсь в симуляторе получить JSON то и здесь получаю. Но через пару часов снова сначала в XCode попытаюсь то обратно не могу авторизоваться, и опять же если в POSTMAN отправлю запрос то и соответственно в приложений тоже.

Я вот как пытался авторизоваться,

func fetchWithBearerToken<T: Decodable>(dataType: T.Type, from url: String, convertFromSnakeCase: Bool = true, completion: @escaping(Result<T, NetworkError>) -> Void) {

    guard let url = URL(string: url) else {
        completion(.failure(.invalidURL))
        return
    }
    
    var request = URLRequest(url: url, timeoutInterval: Double.infinity)
    
    request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
    request.addValue("Asia/Almaty", forHTTPHeaderField: "TimeZone")
    request.addValue("ru-RU", forHTTPHeaderField: "Accept-Language")
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")

    URLSession.shared.dataTask(with: request) { data, _, error in
        guard let data = data else {
            
            completion(.failure(.noData))
            print(error?.localizedDescription ?? "No error description")
            return
        }
        
        print("DATA" + String(data: data, encoding: .utf8)!)
        
        do {
            let decoder = JSONDecoder()
            if convertFromSnakeCase {
                decoder.keyDecodingStrategy = .convertFromSnakeCase
            }

            let type = try decoder.decode(T.self, from: data)
            DispatchQueue.main.async {
                completion(.success(type))
            }
        
        } catch {
            completion(.failure(.decodingError))
        }
    }.resume()
    
}

#10

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