Найти в Дзене
Мытарства джуна

OAuthYandex на Swift

Сегодня разберемся, как добавить в свой проект авторизацию через Яндекс и как получить токен доступа для пользователя. Начнем! Для начала, нужно зарегистрировать свое приложение по адресу https://oauth.yandex.ru/client/new в своем личном кабинете. 2. Затем выбираем коды доступа. У меня будут следующие: 3. После этого вы перейдете на страницу зарегистрированного приложения: Из всех представленных данных нам понадобится client_id. А redirect_uri будет использоваться по умолчанию, в коде указывать его не нужно. 4. Идем в проект. У меня в проекте 2 ViewController и NavigationController. Я верстаю в коде, без storyboard. Идем в AuthViewController. Добавляем webView (не забудьте импортировать WebKit) и настраиваем констрейнты. 5. Затем в AuthViewController создаем request: private var request: URLRequest? { guard var components = URLComponents(string: "https://oauth.yandex.ru/authorize") else { return nil } components.queryItems = [ URLQueryItem(name: "response_

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

Начнем!

Для начала, нужно зарегистрировать свое приложение по адресу https://oauth.yandex.ru/client/new в своем личном кабинете.

  1. Заполняем название проекта, затем в поле выбора платформы выбираем Веб-сервисы. Здесь нас просят указать callback url - обязательно указываем.

2. Затем выбираем коды доступа. У меня будут следующие:

-2

3. После этого вы перейдете на страницу зарегистрированного приложения:

-3
Из всех представленных данных нам понадобится client_id. А redirect_uri будет использоваться по умолчанию, в коде указывать его не нужно.

4. Идем в проект.

У меня в проекте 2 ViewController и NavigationController.

Я верстаю в коде, без storyboard.

Идем в AuthViewController. Добавляем webView (не забудьте импортировать WebKit) и настраиваем констрейнты.

5. Затем в AuthViewController создаем request:

private var request: URLRequest? {
guard var components = URLComponents(string: "https://oauth.yandex.ru/authorize") else { return nil }
components.queryItems = [
URLQueryItem(name: "response_type", value: "token"),
URLQueryItem(name: "client_id", value: "*your client id*")
]
guard let url = components.url else { return nil }
return URLRequest(url: url)
}

6. Говорим webView загрузить данные по request:

override func viewDidLoad() {
super.viewDidLoad()
guard let request = request else {
return
}
self.webView.load(request)
}

7. Возвращаемся в наш ViewController и добавляем в него парочку свойств:

private var isFirst = true
private var token = ""

8. Создаем метод updateData(), в котором добавим проверку на наличие токена. И если токена нет, то открываем страницу входа:

private func updateData() {
guard !token.isEmpty else {
let authVC = AuthViewController()
self.present(authVC, animated: true)
return
}
}

9. Во viewDidAppear добавляем вызов этого метода:

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if isFirst {
self.updateData()
} else {
isFirst = false
}
}

10. Запускаем наше приложение для проверки. Должна открыться форма входа:

-4

11. Супер! Теперь получим access_token для полного счастья!

Для этого идем в наш AuthViewController и подписываем его под протокол WKNavigationDelegate (не забудь во viewDidLoad указать self.webView.navigationDelegate = self).

Реализуем метод decidePolicyFor:

extension AuthViewController: WKNavigationDelegate {
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if let url = navigationAction.request.url, url.scheme == "myphotos" {
let targetString = url.absoluteString.replacingOccurrences(of: "#", with: "?")
guard let components = URLComponents(string: targetString) else { return }
let token = components.queryItems?.first(where: { $0.name == "access_token" })?.value
if let token = token {
self.delegate?.handleTokenChanged(token: token)
dismiss(animated: true)
showAlert(token: token)
}
}
decisionHandler(.allow)
}
}

12. Добавим метод showAlert(), чтобы он выводил токен:

func showAlert(token: String) {
let alert = UIAlertController(title: "Token accepted", message: "New token is: \(token)", preferredStyle: .alert)
let okAction = UIAlertAction(title: "Ok", style: .default)
alert.addAction(okAction)
self.present(alert, animated: true)
}

13. Создадим протокол, с помощью которого будем передавать токен:

protocol AuthViewControllerDelegate: AnyObject {
func handleTokenChanged(token: String)
}

14. И создадим делегат:

weak var delegate: AuthViewControllerDelegate?

15. Идем во ViewController и реализуем этот протокол:

extension ViewController: AuthViewControllerDelegate {
func handleTokenChanged(token: String) {
self.token = token
}
}

16. Не забудем в методе updateData() указать делегата:

private func updateData() {
guard !token.isEmpty else {
let vc = AuthViewController()
vc.delegate = self
self.present(vc, animated: true)
return
}
}

17. Запускаем! Проверяем! Токен получен!

-5