我正在编写一个iOS应用程序以使用Unsplash API。在处理身份验证工作流(通过网站登录)时,出现以下问题:
在Unsplash API上执行授权工作流程之后,我可以在重定向页面上获得授权代码。
1)我打开的内容:https://unsplash.com/oauth/authorize?client_id={myclientid}&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&scope=public
2)Safari通过Authorization code
进入响应页面
3)然后,我需要向https://unsplash.com/oauth/token发出POST请求,并包含Authorization code
/ / / 我的问题是如何使用Swift使用第2步中的Authorization code
?,我可以处理JSON响应,但这是返回的页面视图,什么类或应该用来检索代码值的方法?
/ / /好吧,这是我的代码
class FancyClient {
static let clientID = "clientID"
static let clientSceret = "clientSceret"
struct Auth {
static var accessToken = ""
static var authorizationCode = ""
}
enum Endpoints {
static let base = "https://unsplash.com"
static let apiKeyParam = "?client_id=\(FancyClient.clientID)"
static let apiSecretParam = "?client_secret=\(FancyClient.clientSceret)"
case getAuthorizationCode
case login
case getAccessToken
var stringValue: String {
switch self {
case .getAuthorizationCode:
return Endpoints.base + "/oauth/authorize" + Endpoints.apiKeyParam + "&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob" + "&response_type=code" + "&scope=public"
case .getAccessToken:
return Endpoints.base + "/oauth/token" + Endpoints.apiKeyParam + "&\(Endpoints.apiSecretParam)" + "&redirect_uri=fancyimage:authenticate" + "&code=\(Auth.authorizationCode)" + "grant_type=Value authorization_code"
case .login:
return ""
}
}
var url: URL {
return URL(string: stringValue)!
}
}
class func getAccessToken(url: URL, completion: @escaping (Bool, Error?) -> Void ) {
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
guard let data = data else {
DispatchQueue.main.async {
completion(false, error)
}
return
}
do {
let decoder = JSONDecoder()
let responseObject = try decoder.decode(TokenResponse.self, from: data)
Auth.accessToken = responseObject.accessToken
DispatchQueue.main.async {
completion(true, nil)
}
} catch {
DispatchQueue.main.async {
completion(false, error)
}
}
}
task.resume()
}
}
class LoginViewController: UIViewController {
@IBOutlet weak var loginViaWeb: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func loginViaWebsiteTapped(_ sender: Any) {
print(FancyClient.Endpoints.getAuthorizationCode.url)
UIApplication.shared.open(FancyClient.Endpoints.getAuthorizationCode.url, options: [:], completionHandler: nil)
// if let authorizationCode = responsePage.authorizationCode {
FancyClient.getAccessToken(url: FancyClient.Endpoints.getAccessToken.url) { (success, error) in
// continue...
}
}
}
}