У меня есть приложение steam3, в котором я пытаюсь подключиться к Xero Api, процесс довольно прост. Мы отправляем пользователя на веб-страницу xero, где он входит в систему с данными и авторизует наше соединение, а затем перенаправляется обратно в мое приложение Steam 3. Затем в приложении мы подключаемся к серверу xero с кодом, указанным в перенаправлении, а затем xero должен выдать токен доступа, который будет использоваться в будущем. Процесс описан здесь
Проблема в том, что я не могу подключиться к xero, чтобы получить токен доступа. Я пробовал 2 подхода, первый - использовать HTTPClient с этим кодом:
let m = try decoder.decode(Master.self, from: masterDoc!)
let ci = m.xeroAppKey.data(using: .utf8)?.base64EncodedString() //convert from string to base encoded
let xs = m.xeroAppSec.data(using: .utf8)?.base64EncodedString() //convert from string to base encoded
let authorization = "Basic " + ci! + ":" + xs!
print("authorisation is \(authorization)")
return HTTPClient.connect(hostname: "identity.xero.com", on: req).flatMap{client in
var httpReq = HTTPRequest(method: .POST, url: "https://identity.xero.com/connect/token")
httpReq.headers.add(name: "authorization", value: authorization)
httpReq.headers.add(name: "Content-Type", value: "x-www-form-urlencoded")
httpReq.body = HTTPBody(string: "grant_type=authorization_code&code=\(code)&redirect_uri=http://localhost:8080/XeroAuthRedirect")
return client.send(httpReq).flatMap{resp in
print("response is \(resp) with status \(resp.status)")
return req.future().map{
return .ok
}
}
}
На это я получаю такой ответ:
HTTP/1.1 301 Moved Permanently
Server: AkamaiGHost
Content-Length: 0
Location: https://identity.xero.com/connect/token
Expires: Tue, 02 Jun 2020 07:59:59 GMT
Cache-Control: max-age=0, no-cache, no-store
Pragma: no-cache
Date: Tue, 02 Jun 2020 07:59:59 GMT
Connection: keep-alive
Это говорит о том, что конечная точка переместилась, но предложенное место совпадает с тем, к которому я пытаюсь подключиться. Я не могу найти нигде в документах, которые предполагали, что конечная точка изменилась. Также кажется, что HTTPClient не будет следовать перенаправлениям.
Поэтому я попытался подключиться с помощью URLSession вместо этого кода:
let url = URL(string:"https://identity.xero.com/connect/token")!
let payload = "grant_type=authorization_code&code=\(code)&redirect_uri=http://localhost:8080/XeroAuthRedirect".data(using: .utf8)
let promise = req.eventLoop.newPromise(HTTPStatus.self)
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue(authorization, forHTTPHeaderField: "authorization")
request.addValue("x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.httpBody = payload
URLSession.shared.dataTask(with: request) {(data, response, error) in
if let error = error {
print(error.localizedDescription)
promise.fail(error: error) // (!)
return
}
guard let data = data else {
print("empty data")
promise.fail(error: SumUpError.invalidResponse) // (!)
return
}
guard let str = String(data: data, encoding: .utf8) else {
print("invalid data")
promise.fail(error: SumUpError.invalidResponse) // (!)
return
}
print(str)
print("response is \(String(describing: response))")
}.resume()
Где я получаю следующее сообщение об ошибке.
{"error":"invalid_request"}
Мы очень ценим любые идеи, что здесь происходит или как я могу установить и запустить это соединение.
application/x-www-form-urlencoded
, что немного отличается от вашего. - person droopsnoot   schedule 02.06.2020authorization: "Basic " + base64encode(client_id + ":" + client_secret)
, который, как я понял, означает, что я должен закодировать идентификатор и секрет клиента и добавить их в строку с Basic в начале. Вы видите это иначе? - person Joby Ingram-Dodd   schedule 02.06.2020