OAuth2: как сделать аутентификацию с Unspla sh API - PullRequest
0 голосов
/ 31 января 2020

Я пишу приложение iOS для использования Unspla sh API. И я получаю ниже проблему при работе с рабочим процессом аутентификации (вход через веб-сайт):

После рабочего процесса авторизации на Unspla sh 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) Затем мне нужно сделать запрос POST к https://unsplash.com/oauth/token и включают Authorization code

/ / / * Мой вопрос: как получить Authorization code в Шаге 2 со Swift? , я мог бы разобраться с 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...
            }
        }

    }

}
...