- The fast, easy way to sign in to apps and websites.
- Respect for privacy.
- Security built in.
- Antifraud.
- Works everywhere.
- Get Started
- Внедряем Sign in with Apple в свое iOS приложение
- Пишем сервис авторизации через Apple
- Нюансы, о которых нужно знать
- Внедряем Sign in with Apple — систему авторизации от Apple
- Настраиваем Apple Developer Account
- Добавляем кнопку Sign In with Apple в iOS-приложение
- Реализуем Sign in with Apple для web и Android
- Получение данных
- How to verify code from «Sign In with Apple»?
- 4 Answers 4
- Update 2020.07
- Все, что вы хотели знать о функции Sign in with Apple
- Введение
- Приступая к работе с Sign in with Apple
- Пользовательская сторона
- Вывод
The fast, easy way to sign in to apps and websites.
Sign in with Apple makes it easy for users to sign in to your apps and websites using their Apple ID. Instead of filling out forms, verifying email addresses, and choosing new passwords, they can use Sign in with Apple to set up an account and start using your app right away. All accounts are protected with two-factor authentication for superior security, and Apple will not track users’ activity in your app or website.
Respect for privacy.
Sign in with Apple was built from the ground up to give users peace of mind about their privacy. Data collection is limited to the user’s name and email address, and Apple’s private email relay lets users receive email even if they prefer to keep their address private. Apple will not track users as they interact with your app.
Security built in.
Every account using Sign in with Apple is automatically protected with two-factor authentication. On Apple devices, users are persistently signed in and can re-authenticate anytime with Face ID or Touch ID.
Antifraud.
Sign in with Apple is designed to give you confidence in your new users. It uses on-device machine learning and other information to provide a new privacy-friendly signal that helps you determine if a new user is a real person or an account you might want to take another look at.
Works everywhere.
Sign in with Apple works natively on iOS, macOS, tvOS, and watchOS. And it works in any browser, which means you can deploy it on your website and in versions of your apps running on other platforms.
Get Started
Learn how to plan, implement, and test Sign in with Apple in your apps and websites.
Источник
Внедряем Sign in with Apple в свое iOS приложение
На WWDC 2019 Apple в очередной раз нарушила покой iOS разработчиков — представила новую систему авторизации пользователей Sign in with Apple. Теперь все iOS приложения, которые используют сторонние системы авторизации (Facebook, Twitter, etc.), должны в обязательном порядке реализовать Sign in with Apple, иначе выгонят из AppStore. Мы решили не испытывать судьбу и побежали внедрять эту фичу. Как именно мы это сделали — узнаете под катом.
Пишем сервис авторизации через Apple
В своей работе мы используем архитектуру VIPER+SOA, поэтому авторизацию через Apple мы сделали как отдельный сервис. Сначала мы оборачиваем данные в enum, чтобы удобно расширять типы авторизации (фейсбук, вк, гугл и т.д.):
Результат наружу будем передавать с помощью Observable из RxSwift:
Нюансы, о которых нужно знать
- У Sign in with Apple нету функции logout в классическом понимании этого слова. Библиотека не хранит никакие данные, в отличие от других библиотек входа, поэтому нет необходимости стирать данные, полученные при логине.
- Sign in with Apple получает имя и фамилию пользователя только один раз при самом первом логине. У сервера нет доступа к этим данным. При последующих попытках входа вам будут приходить только authorizationCode из ASAuthorizationAppleIDCredential. Поэтому мы на клиентской стороне храним имя и фамилию пользователя до тех пор, пока регистрация на сервере не завершится успешно.
- Sign in with Apple позволяет пользователю подменить свой e-mail. На подмененный e-mail можно написать только с тех доменов, которые вы укажете в настройках на developer.apple.com
- В этой статье описано то, как мы реализовали back-end часть.
Статья получилось небольшой, но надеемся что она была полезной для вас.
Источник
Внедряем Sign in with Apple — систему авторизации от Apple
Этим летом на конференции WWDC 2019 Apple представила собственную систему авторизации Sign in with Apple и сделала ее обязательной для всех приложений в App Store, которые используют вход через соцсети. Исключение составляют образовательные, корпоративные, правительственные и бизнес-приложения, использующие собственную авторизацию. К Sign in with Apple Apple сделала качественную документацию, и в этой статье мы на примере ЦИАН расскажем, как внедрить ее в свой сервис.
Настраиваем Apple Developer Account
Работа по интеграции начинается с настройки аккаунта разработчика. Сначала нужно включить опцию Sign In with Apple для вашего App ID. Для этого заходим в список идентификаторов в Apple Developer Account, выбираем необходимый App ID и включаем для него опцию Sign In with Apple.
Теперь настраиваем Service ID — уникальный идентификатор web-приложения, который понадобится для обращения к Sign in with Apple API. Всего на один App ID можно создать до 5 Service ID. Для этого нажимаем кнопку создания идентификаторов, выбираем Service ID, заполняем необходимые поля и нажимаем Edit в поле Sign In With Apple. Откроется форма, где выбираем правильный Primary App ID, указываем веб-домен и перечислям URL для редиректа после успешного логина. Надо учитывать, что можно ввести только 10 Return URLs:
Для сохранения нажимаем Save, Continue и Register. Да, при любых изменениях конфигурации необходимо нажимать все три кнопки, иначе изменения не вступят в силу.
Теперь в списке Service ID выбираем созданный идентификатор и опять нажимаем Edit в поле Sign In With Apple. В открывшемся окне у поля с веб-адресом видим две новые кнопки:
Этот файл необходим, чтобы Apple верифицировала ваш ресурс. Скачиваем его и размещаем его на своем ресурсе. Сразу у нас этот финт не сработал: когда наши админы добавили файл, то по указанному url срабатывал редирект (302) на файл, лежащий в другом месте, и Apple его не верифицировал. Тогда пришлось размещать файл по прямому доступу по URL (200). После того как Apple успешно проверит файл, рядом с доменом загорится зеленая галочка:
Из раздела идентификаторов переходим в раздел Keys и создаем новый ключ. Для этого ставим галочку Sign In with Apple и нажимаем сначала Configure, чтобы проверить App ID, затем Continue:
На следующем экране обязательно скачиваем файл с ключом и сохраняем его в безопасном месте, так как после ухода с этого экрана ключ будет недоступен для скачивания. На этой же странице можно увидеть Key ID, который нам еще понадобится:
Для пользователей у Sign In with Apple есть бонус: она позволяет предоставить фейковый e-mail, на который можно писать только с доверенных адресов. В этом случае нужна дополнительная настройка. Открываем раздел More, нажимаем Configure в разделе Sign In with Apple и вписываем свой URL:
Добавляем кнопку Sign In with Apple в iOS-приложение
ЦИАН работает на трех платформах: iOS, Android, Web. Для iOS есть нативное SDK, поэтому авторизация будет выглядеть следующим образом:
Чтобы добавить в iOS-приложение Sign in with Apple, добавляем кнопку ASAuthorizationAppleIDButton и вешаем на нее обработчик нажатия:
Кроме ASAuthorizationAppleIDProvider, обратите внимание еще на ASAuthorizationPasswordProvider, который позволяет получать связки «логин-пароль» из Keychain.
Теперь мы реализуем ASAuthorizationControllerPresentationContextProviding:
Создаем делегат ASAuthorizationControllerDelegate, который сообщает об успехе или ошибке:
Полученный authorizationCode мы отправляем на сервер и ждем ответа от бэкенда об успешности авторизации в нашей системе.
Реализуем Sign in with Apple для web и Android
Внезапно, для Android и Web Apple не предоставляет SDK, поэтому в обоих случаях нужно открыть страницу авторизации от Apple и процесс будет иным:
URL для страницы авторизации выглядит следующим образом:
Рассмотрим его параметры:
- client_id — Service ID, который регистрировали выше.
- redirect_uri — URI, куда пользователь перенаправляется после успешной аутентификации через AppleID. Этот URI мы указывали выше при настройке Apple Developer.
- state — идентификатор сессии пользователя, который Apple вернет при вызове redirect_uri, чтобы мы могли проверить отправителя. Правило генерации этого параметра можете придумать самостоятельно, например, рандомную строку.
- scope — в этом параметре указывается, какая нужна информация от пользователя. Например, name, email или сразу оба, как в примере выше.
- response_type — этот параметр указывает, в каком виде нужен ответ. Он может быть code или id_token. Если выбрать id_token, то его нужно уточнить параметром response_mode, в котором можно указать query, fragment и form_post.
После успешной двухфакторной аутентификации через appleID Apple вызовет указанный redirect_uri и передаст параметры state и code:
В параметре code передается одноразовый код аутентификации пользователя, который действует в течение 5 минут. В параметре state — идентификатор сессии, отправленный при создании формы авторизации, а в параметре user — данные пользователя.
Получение данных
На всех клиентах, чтобы сохранить данные пользователя, нужно получить от Apple access_token. Для этого сначала запрашиваем authorization_code:
- в client_id указывается созданный для web-приложений ServiceID и AppID для iOS-приложения.
- code — мы получили выше после редиректа или передали с iOS-клиента
- в параметре grant_type передаем цель получения токена: авторизация (authorization_code) или продление токена (refresh_token)
- в параметре client_secret — JSON Web Tokens на основе секретного ключа, полученного при регистрации приложения.
Создать JSON Web Tokens можно на Python:
Если все прошло успешно, то в ответе придут такие параметры:
Ура, вот и access_token. Вместе с ним приходит refresh_token, которым можно обновить при необходимости access_token.
Информация о пользователе хранится в поле id_token, но его нужно декодировать:
Apple_public_key — это публичный ключ, который можно получить по ссылке.
После декодирования получаем:
Email передается только один раз, когда пользователь впервые авторизуется в вашем сервисе через Sign in with Apple. В следующий раз Apple передаст эти данные только в том случае, если пользователь самостоятельно отвяжет ваше приложение. Этим авторизация от Apple отличается от других сервисов, где данные можно получить через API, и мы не нашли информацию о том, что они планируют реализовать что-то подобное.
В этом ответе нам нужны параметры sub, который передается каждый раз, и email, поэтому мы сохраняем их у себя в системе и сообщаем клиенту о успешной авторизации. PROFIT.
Источник
How to verify code from «Sign In with Apple»?
I’m trying to verify the code I got from the «Sign In with Apple» service on my Redirect Uri. I used the information from the documentation to create the post data and generate the «client_secret».
My functions to generate the «client_secret» can be found below:
My variables in this example:
$kid is my identifier for my private key. In this example it is JYJ5GS7N9K. I got the identifier from here https://developer.apple.com/account/resources/authkeys/list
$iss is my team identifier from my developer account. In this example it is WGL33ABCD6.
$sub is the same value as «client_id». My «client_id» in this example is «dev.hanashi.sign-in-with-apple». I got the client id from the app identifiers here: https://developer.apple.com/account/resources/identifiers/list
$key is my generated private key by developer account. The key has format like this:
This is the php code to make the request:
I get now the response <"error":"invalid_client">from the apple server. What am I doing wrong? Could it be that I’m generating the JWT token wrong?
4 Answers 4
The problem for me was that I forgot to verify my domain under the Service Id section of the Apple dev portal.
The website doesn’t verify automatically, you have to click the verify button and get a green tick next to the domain to be sure. After this, I had no more invalid_client issues.
Update 2020.07
As the flow was changed, you just have to add the Domain and the Communication Email to:
Certificates, Identifiers & Profiles > More > Configure
I had this error several times. Here are the causes I could find:
- Improper Domain Verification and invalid redirect_uri
- Client ID is not correct: your client ID could be incorrect.
- JWT encoder is not working properly: maybe it doesn’t support the ES256 algorithm?
- Request type: for /auth/authorize, you need to use x-www-form-urlencode, oherwise you get invalid_client errors.
When I solved these problems, I started to get invalid_grant error. Here were the steps I had been doing:
- I created client_secret via JWT
- I navigated to https://appleid.apple.com/auth/authorize?response_type=code&state=abcdefg&client_id=com.company.apple-sign-in-abcd&scope=openid&redirect_uri=https://app.com/redirect_uri manually on web browser,
- authorized
- it redirected back to backend url (which gave 404 because it was not deployed yet).
- I copied the code argument in the url bar when
- With the copied code , I POSTeed the https://appleid.apple.com/auth/token endpoint with x-www-form-urlencoded arguments:
- code
- client_id
- client_secret
- redirect_uri
- grant_type=»authorization_code»
If you lose a few seconds, code gets invalidated and you’ll get invalid_grant error. If you copy and paste immediately within second, you’ll get your response:
The next step would be decoding id_token with Apple’s public key.
Источник
Все, что вы хотели знать о функции Sign in with Apple
На мой взгляд, анонс сервиса Sign in with Apple, который был представлен на WWDC 2019, является одним из интереснейших, если брать во внимание вопрос приватности и конфиденциальности пользовательских данных.
Владислав Вчерашний, iOS-разработчик, рассказывает про тонкости работы с системой авторизации Sign in with Apple.
В ожидании WWDC 2020, которая, к слову, впервые будет проходить в онлайн режиме из-за всем известных событий, предлагаю вспомнить интересные (пока еще) новинки (зачеркнуто) с прошлогодней конференции разработчиков Apple.
Введение
На мой взгляд, анонс сервиса Sign in with Apple, который был представлен на WWDC 2019, является одним из интереснейших, если брать во внимание вопрос приватности и конфиденциальности пользовательских данных.
Сервис Sign in with Apple – это, своего рода альтернатива уже существующей возможности авторизоваться на сайте и/или в приложении через Facebook / Google / Twitter / LinkedIn и другие подобные сервисы. Уже очень давно эти функции стали для нас привычными и удобными, а теперь к этому долгому списку добавляется еще одна, но уже от компании Apple. Так зачем же это нам? Давайте разбираться.
Приступая к работе с Sign in with Apple
Важно: для использования Sign In with Apple у вас должен быть куплен аккаунт разработчика.
Первым делом открываем (создаём) проект и переходим во вкладку Project Navigator > Select your target > Signing and Capabilities tab и добавляем “Sign In with Apple”.
Pic. 1 — Project Navigator > Select your target > Signing and Capabilities tab
» data-medium-file=»https://i2.wp.com/apptractor.ru/wp-content/uploads/2020/04/2-5.png?fit=1024%2C567&ssl=1″ data-large-file=»https://i2.wp.com/apptractor.ru/wp-content/uploads/2020/04/2-5.png?fit=740%2C410&ssl=1″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20740%20410’%3E%3C/svg%3E» alt=»Все, что вы хотели знать о функции Sign in with Apple» width=»740″ height=»410″ data-lazy-srcset=»https://i2.wp.com/apptractor.ru/wp-content/uploads/2020/04/2-5.png?w=1384&ssl=1 1384w, https://i2.wp.com/apptractor.ru/wp-content/uploads/2020/04/2-5.png?resize=1024%2C567&ssl=1 1024w, https://i2.wp.com/apptractor.ru/wp-content/uploads/2020/04/2-5.png?resize=640%2C354&ssl=1 640w, https://i2.wp.com/apptractor.ru/wp-content/uploads/2020/04/2-5.png?resize=768%2C425&ssl=1 768w» data-lazy-sizes=»(max-width: 740px) 100vw, 740px» data-recalc-dims=»1″ data-lazy-src=»https://i2.wp.com/apptractor.ru/wp-content/uploads/2020/04/2-5.png?resize=740%2C410&ssl=1″/>
Pic. 1 — Project Navigator > Select your target > Signing and Capabilities tab
» data-medium-file=»https://i0.wp.com/apptractor.ru/wp-content/uploads/2020/04/3-4.png?fit=1024%2C746&ssl=1″ data-large-file=»https://i0.wp.com/apptractor.ru/wp-content/uploads/2020/04/3-4.png?fit=740%2C539&ssl=1″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20740%20539’%3E%3C/svg%3E» alt=»Pic. 2 — Sign In with Apple» width=»740″ height=»539″ data-lazy-srcset=»https://i0.wp.com/apptractor.ru/wp-content/uploads/2020/04/3-4.png?w=1350&ssl=1 1350w, https://i0.wp.com/apptractor.ru/wp-content/uploads/2020/04/3-4.png?resize=1024%2C746&ssl=1 1024w, https://i0.wp.com/apptractor.ru/wp-content/uploads/2020/04/3-4.png?resize=640%2C466&ssl=1 640w, https://i0.wp.com/apptractor.ru/wp-content/uploads/2020/04/3-4.png?resize=768%2C560&ssl=1 768w» data-lazy-sizes=»(max-width: 740px) 100vw, 740px» data-recalc-dims=»1″ data-lazy-src=»https://i0.wp.com/apptractor.ru/wp-content/uploads/2020/04/3-4.png?resize=740%2C539&ssl=1″/>
Pic. 2 — Sign In with Apple
Следующим шагом переходим в ViewController и импортируем библиотеку AuthenticationServices:
Далее нам нужно добавить кнопку на экран. Делается это очень просто и всего в несколько строчек кода:
» data-medium-file=»https://i2.wp.com/apptractor.ru/wp-content/uploads/2020/04/4-3.png?fit=424%2C76&ssl=1″ data-large-file=»https://i2.wp.com/apptractor.ru/wp-content/uploads/2020/04/4-3.png?fit=424%2C76&ssl=1″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20424%2076’%3E%3C/svg%3E» alt=»Sign in with Apple» width=»424″ height=»76″ data-recalc-dims=»1″ data-lazy-src=»https://i2.wp.com/apptractor.ru/wp-content/uploads/2020/04/4-3.png?resize=424%2C76&ssl=1″/>
Pic. 3 — Строго рекомендуется использовать стандартную кнопку от Apple.
Кнопку можно легко кастомизировать, на ваш выбор доступны 3 разных стиля (.black, .white и .whiteOutline) и типов (.signIn, .signUp и .continue). Также у Apple есть подробные и прекрасные гайдлайны здесь.
После добавления кнопки нам нужно добавить обработку действия по нажатию на неё:
- Создаём запрос и описываем необходимый скоуп данных (например: имя и почта)
- Создаём ASAuthorizationController и задаем его делегат
- Выполняем созданный запрос
И последнее что нужно сделать –– это подключить контроллер к протоколам ASAuthorizationControllerPresentationContextProviding и ASAuthorizationControllerDelegate, и реализовать их.
Важно знать: реализация протокола ASAuthorizationControllerPresentationContextProviding необязательная. Это нужно для корректного отображения окна входа.
Важно знать: после первой авторизации вам больше не будут доступны данные пользователя. Убедитесь в правильном сохранении данных сразу.
После регистрации и сохранения пользователя его актуальность и легитимность время от времени нужно сверять с данными Apple:
Пользовательская сторона
Как проходит авторизация со стороны пользователя? Все очень просто, а главное – удобно:
- Нажать на кнопку Sign In with Apple
- Выбрать информацию, которую будет видно разработчику в показанном окне
- Подтвердить регистрацию через Face ID/Touch ID
Все, учетная запись создана! Стоит отметить, что Apple ID защищена двухфакторной аутентификацией, а также учетная запись не имеет пароля, это значит, что ее украсть будет невозможно.
К слову о приватности. Если пользователь решит не передавать свой адрес электронной почты, Apple создаст некий виртуальный адрес и передаст его разработчику. На него впоследствии и будут приходить “письма счастья”.
По словам Apple, функция Sign In with Apple будет обязательной для всех приложений, которые используют возможность авторизации через социальные сети (Google, Facebook и пр.). Если же разработчик откажется от внедрения этой функции, он обязан также убрать и другие кнопки социальных сетей.
Работать новая функция будет не только на всех платформах компании Apple, но и на веб-сайтах и в приложениях Android и Windows — с помощью представленной библиотеки на JavaScript.
Вывод
Вы еще не поняли зачем вам это нужно и в чем разница относительно других сервисов? При входе в приложение через Facebook/Google пользователь передает всю информацию о том, какое приложение и когда используется, и пользователь не имеет достаточного контроля над приватностью (при входе пользователь разрешает или запрещает доступ к определенным данным), а вот что получит Google или Facebook из этого приложения – простите-извините, вам знать не положено.
Как говорит сам Facebook в своей политике конфиденциальности: мы можем получить информацию об устройстве, посещенных сайтах, покупках, увиденной рекламе и использовании служб. Собственно, последние скандалы вокруг Facebook тонко намекают, что нужно дважды подумать, стоит ли доверять компании столько личной информации, которая впоследствии может быть передана другим компаниям.
Я бы хотел еще отметить важную деталь. Я уверен в компании Apple и в том, что ее целью является не сбор дополнительных персональных данных пользователей, а наоборот – минимизация возможных утечек данных в других приложениях, которые сама Apple контролировать не в состоянии.
Исходный код проекта доступен здесь.
Также официальная документация по Sign In with Apple здесь.
Источник