Slide 1

Slide 1 text

Зачем нам OAuth и тем более 2.0 Как настроить авторизацию сторонних сервисов в приложении Юлия Никитина, [email protected]

Slide 2

Slide 2 text

Что будет 1.Как появился OAuth 2.0 и чем он отличается от OAuth 1.0 2.Как работают access и refresh токены 3.Примеры реализации, плюсы и минусы 4.Новые способы использования в iOS 12/13 и пара слов о SignIn with Apple 2

Slide 3

Slide 3 text

Чего не будет 1.Алгоритмов шифрования 2.Сложных терминов 3.Доклада на 60 минут

Slide 4

Slide 4 text

Preface

Slide 5

Slide 5 text

Где используется OAuth 2.0

Slide 6

Slide 6 text

Где используется OAuth 2.0

Slide 7

Slide 7 text

Как дать доступ другому приложению без OAuth Вариант №1. Вводить пароль для каждого действия в приложении

Slide 8

Slide 8 text

Как дать доступ другому приложению без OAuth Вариант №2. Отдать свой пароль от сервиса стороннему приложению Вариант №1. Вводить пароль для каждого действия в приложении

Slide 9

Slide 9 text

Как дать доступ другому приложению без OAuth Вариант №2. Отдать свой пароль от сервиса стороннему приложению Вариант №1. Вводить пароль для каждого действия в приложении

Slide 10

Slide 10 text

Как появился OAuth 1.0 FlickrAuth AuthSub BBAuth (Browser-Based Auth)

Slide 11

Slide 11 text

Решение Выдать приложению временный токен с ограниченным сроком действия вместо реального пароля пользователя

Slide 12

Slide 12 text

Как появился OAuth 1.0 Blaine Cook, chief architect, Twitter "We want something like Flickr Auth / Google AuthSub / Yahoo! BBAuth, but published as an open standard, with common server and client libraries, etc"

Slide 13

Slide 13 text

Как появился OAuth 1.0 FlickrAuth AuthSub + = ❤ https://tools.ietf.org/html/rfc5849

Slide 14

Slide 14 text

Как появился OAuth 2.0 Yahoo! Facebook Salesforce Microsoft Twitter Foursquare Deutsche Telekom Intuit Mozilla Google Eran Hammer + = https://tools.ietf.org/html/rfc6749

Slide 15

Slide 15 text

Как появился OAuth 2.0 22 полных пересмотра спецификации "protocol" -> "framework" в 2012 Eran Hammer выходит из рабочей группы и просит удалить свое имя из списка авторов

Slide 16

Slide 16 text

Как работает OAuth 2.0 OAuth

Slide 17

Slide 17 text

OAuth 1.0 vs OAuth 2.0 client consumer resource owner service provider user resource server нет разделения на resource server и auth server появились роли: client, auth server, resource server, resource owner protocol жесткие правила framework рекомендации к реализации

Slide 18

Slide 18 text

Как работает OAuth 2.0 Intuit Zaim Tumblr Slack Uber Gitter Facebook Spotify Trello Buffer Goodreads Typetalk SoundCloud Doper NounProject Twitter Flickr Github Instagram Foursquare Fitbit Withings Linkedin Dropbox Dribbble Salesforce BitBucket GoogleDrive

Slide 19

Slide 19 text

Flow OAuth 2.0 Зарегистрировать приложение у провайдера и получить client id Создать/получить URL для логина пользователя Открыть URL После успешного логина получить код авторизации Вернуться в приложение по redirect-ссылке 1 2 3 4 5 6 Обменять код на access token

Slide 20

Slide 20 text

Flow OAuth 2.0 Зарегистрировать приложение у провайдера и получить client id Создать/получить URL для логина пользователя Открыть URL После успешного логина получить код авторизации Вернуться в приложение по redirect-ссылке 1 2 3 4 5 6 Обменять код на access token

Slide 21

Slide 21 text

Flow OAuth 2.0 Зарегистрировать приложение у провайдера и получить client id Создать/получить URL для логина пользователя Открыть URL После успешного логина получить код авторизации Вернуться в приложение по redirect-ссылке 1 2 3 4 5 6 Обменять код на access token Зарегистрировать приложение у провайдера и получить client id

Slide 22

Slide 22 text

Flow OAuth 2.0 https://github.com/login/oauth/authorize URL для WebView, где будет авторизовываться пользователь

Slide 23

Slide 23 text

Flow OAuth 2.0 https://github.com/login/oauth/authorize? client_id=12345fdfd111 URL для WebView, где будет авторизовываться пользователь

Slide 24

Slide 24 text

Flow OAuth 2.0 https://github.com/login/oauth/authorize? client_id=12345fdfd111& redirect_uri=joliejuly.GitHubTest://redirect URL для WebView, где будет авторизовываться пользователь

Slide 25

Slide 25 text

Flow OAuth 2.0 GET https://github.com/login/oauth/authorize? client_id=12345fdfd111& redirect_uri=joliejuly.GitHubTest://redirect& scope=repo URL для WebView, где будет авторизовываться пользователь

Slide 26

Slide 26 text

Flow OAuth 2.0 Зарегистрировать приложение у провайдера и получить client id Создать/получить URL для логина пользователя Открыть URL После успешного логина получить код авторизации Вернуться в приложение по redirect-ссылке 1 2 3 4 5 6 Обменять код на access token

Slide 27

Slide 27 text

Flow OAuth 2.0 Зарегистрировать приложение у провайдера и получить client id Создать/получить URL для логина пользователя Открыть URL После успешного логина получить код авторизации Вернуться в приложение по redirect-ссылке 1 2 3 4 5 6 Обменять код на access token

Slide 28

Slide 28 text

Flow OAuth 2.0 Зарегистрировать приложение у провайдера и получить client id Создать/получить URL для логина пользователя Открыть URL После успешного логина получить код авторизации Вернуться в приложение по redirect-ссылке 1 2 3 4 5 6 Обменять код на access token

Slide 29

Slide 29 text

URL Scheme URL для того, чтобы открыть приложение после успешной авторизации в браузере

Slide 30

Slide 30 text

Flow OAuth 2.0 https://github.com/login/oauth/access_token URL для обмена кода на токен

Slide 31

Slide 31 text

Flow OAuth 2.0 https://github.com/login/oauth/access_token? client_id=12345fdfd11 URL для обмена кода на токен

Slide 32

Slide 32 text

Flow OAuth 2.0 https://github.com/login/oauth/access_token? client_id=12345fdfd11& client_secret=0000032323232111110000777 URL для обмена кода на токен

Slide 33

Slide 33 text

Flow OAuth 2.0 POST https://github.com/login/oauth/access_token? client_id=12345fdfd11& client_secret=0000032323232111110000777&
 code=512a1c5309024264d853 URL для обмена кода на токен

Slide 34

Slide 34 text

Flow OAuth 2.0 Зарегистрировать приложение у провайдера и получить client id Создать/получить URL для логина пользователя Открыть URL После успешного логина получить код авторизации Вернуться в приложение по redirect-ссылке 1 2 3 4 5 6 Обменять код на access token

Slide 35

Slide 35 text

Flow OAuth 2.0 Зарегистрировать приложение у провайдера и получить client id Создать/получить URL для логина пользователя Открыть URL После успешного логина получить код авторизации Вернуться в приложение по redirect-ссылке Обменять код на access token URL для логина код авторизации URL для access токена

Slide 36

Slide 36 text

Access / Refresh

Slide 37

Slide 37 text

Access / Refresh Refresh token Access token Access Token Protected Resource

Slide 38

Slide 38 text

Access / Refresh Access token дает доступ, который действует ограниченное время (например, час) Refresh token используется вместо access token'а, когда истечет его срок действия. Refresh token действует несколько месяцев

Slide 39

Slide 39 text

Реализация через библиотеки pod 'GoogleSignIn' pod 'FBSDKLoginKit'

Slide 40

Slide 40 text

Google Sign In

Slide 41

Slide 41 text

OAuthSwift

Slide 42

Slide 42 text

OAuthSwift oauthswift = OAuth2Swift( consumerKey: "********", consumerSecret: "********", authorizeUrl: "https://api.instagram.com/oauth/authorize", responseType: "token" ) let handle = oauthswift.authorize( withCallbackURL: URL(string: "oauth-swift://oauth-callback/ instagram"), scope: "likes+comments", state:"INSTAGRAM") { result in switch result { case .success(let (credential, response, parameters)): print(credential.oauthToken) case .failure(let error): print(error.localizedDescription) } }

Slide 43

Slide 43 text

ASWebAuthenticationSession - iOS 12 SFAuthenticationSession - iOS 11 func login() { let authUrl = makeAuthorizeUrl() webAuthSession = ASWebAuthenticationSession( url: authUrl, callbackURLScheme: Constants.callbackScheme) { [weak self] (callbackUrl, error) in guard let url = callbackUrl, error == nil else { return } let components = URLComponents(string: url.absoluteString) if let codeItem = components?.queryItems?.first(where: { $0.name == Constants.responseType}), let code = codeItem.value { self?.exchangeCodeToToken(code) } } webAuthSession?.start() } import AuthenticationServices

Slide 44

Slide 44 text

Sign in with Apple - iOS 13

Slide 45

Slide 45 text

Learn more https://www.oauth.com

Slide 46

Slide 46 text

Learn more • как работать с refresh токенами - https://auth0.com/blog/ refresh-tokens-what-are-they-and-when-to-use-them/ • JWT Handbook от auth0.com 
 https://auth0.com/resources/ebooks/jwt-handbook • ASWebAuthenticationSession - https://dev.to/robotsquidward/ quick-guide-to-aswebauthenticationsession-api-changes-in- ios-13-4m8i • ASWebAuthenticationSession 2 - https://ajkueterman.dev/ posts/sfauthenticationsession-and- aswebauthenticationsession/

Slide 47

Slide 47 text

No content