2020年5月開始,Apple已強制只要有第三方登入的App,一定要加上Apple Sign In (蘋果登錄)功能。🤪
也就是說,Apple也想要角逐第三方登入。先前我已寫文章觀察其他App,參考:Apple 強迫整合 Sign In With Apple。
這一篇來談技術相關層面~
背景
在WWDC 2019,蘋果推出了Sign In with Apple這一iOS 13的新特性,用戶可以直接利用蘋果ID登錄應用,免去了輸入電子信箱、密碼,驗證登錄電子信箱等繁瑣的步驟。同時Sign In with Apple提供了跨平台特性和安全性的提高。
另一方面它也提出了新的審核要求,在新的要求中提到凡包含了第三方登錄的應用,則同樣需要整合Sign In with Apple,否則會有審核風險:
Sign In with Apple will be available for beta testing this summer. It will be required as an option for users in apps that support third-party sign-in when it is commercially available later this year.
另外使用Sign In with Apple需要用戶開啟了雙重認證,如果沒有開啟則會在第一次使用時提示開啟,不開啟將無法使用。
準則
關於 Apple ID 登入,官方有提出適用範圍,詳細內容位於 App Store Review Guidelines 的 “4.8 Sign in with Apple”,翻譯如下:
若專門使用第三方或社群登入服務(比方 Google、Facebook 登入等等)做為註冊、驗證用戶的主帳號,也必須加上 APPLE ID 登入的選項,且視覺比重需比照其他登入方式。
用戶的主帳號意指在 APP 中建立的帳戶,用於識別自己的身份,登入並使用相關功能和服務。
以下情況可不用導入 APPLE ID 登入:
- 只能用企業內部帳號註冊、登入。
- 教育、公司團體、商務類 APP,只能用單位內部帳號登入。
- 使用公部門、特定產業的身份識別系統或電子編號來驗證身份。
- 第三方服務的客戶端,必須登入信箱、社群平台,或其他第三方帳號才能看到內容。
如何整合
在項目中加入AuthenticationServices.framework即可。當需要使用時,需要在文件中添加<AuthenticationServices/AuthenticationServices.h>引用。
發起請求
處理請求結果
在「新用戶登錄」的情況下,返回的credential為ASAuthorizationAppleIDCredential,而「舊用戶登錄」的情況下,則返回ASPasswordCredential。
我們側重於ASAuthorizationAppleIDCredential屬性的解析:
- User ID : 蘋果用戶唯一標識符,它在同一個開發者帳號下的所有App下是一樣的,我們可以用它來與後台的帳號體系綁定起來(類似於微信的OpenID)。
- Verification Data : 包括identityToken, authorizationCode。用於傳給開發者後台服務器,然後開發者服務器再向蘋果的身份驗證服務端驗證本次授權登錄請求數據的有效性和真實性。
- Account Information : 蘋果用戶資訊,包括全名、電子信箱等,登錄時用戶可以選擇隱藏真實的郵件地址和隨意修改姓名。
- Real User Indicator : 用於判斷當前登錄的蘋果帳號是否是一個真實用戶,取值有:unsupported、unknown、likelyReal。
流程說明
- 發起Apple ID登錄請求
- 返回Apple ID登錄相關資料(Identity Token, User ID)
- 客戶端向後台傳送相關資料(Identity Token, User ID)
- 後台向Apple服務器取得Public Key
- 返回Public Key,並對Identity Token進行驗證
- 告知客戶端驗證結果
Apple Login 回傳資料
上圖是不隱藏Email,若隱藏Email,則Email會呈現:
f2fnear5ek@privaterelay.appleid.com
Apple Login 資料說明
- user:Apple 唯一識別碼,該值在同一個開發者帳號下所有的 App 都會是一樣的,例:000636.0b45a103dc6245eda0b03ba78
- familyName:可由用戶更改
- givenName:可由用戶更改
- email:分為真實Email與隱匿Email,例:f2fnear5ek@privaterelay.appleid.com
- authorizationCode:傳送給Server認證用
- identityToken:傳送給Server認證用
需注意:用戶姓名在第一次Apple login可以拿到,第二次之後Apple login就拿不到姓名,除非用戶登出iPhone手機,再次登入帳號,接著再來使用我們App的Apple login。
- identityToken 是 NSData 格式
- 轉成 UTF8 格式(將傳給server)
- 就是 JWT (JSON Web Tokens)
JWT解碼網址:https://jwt.io/
看官可以試試看把上圖的identityToken解碼一下,保證是無法解碼喔~🤡
上圖是後台拿到identityToken解碼後的資料,sub其實就是唯一識別碼,跟Facebook ID、Line ID、Goolge ID是差不多的東西。
Apple登入功能在2020/5開始,Apple強制只要有第三方登入功能的App都要加上Apple登入,Web和Android雖然沒有被Apple管到,不過Web和Android對Apple登入需求將會與日俱增,可考慮開始實作。🤓
前一陣子觀察我們家App,Apple登入比率約10%,近日觀察Apple登入已14.5%,也就是6人中有1人使用Apple登入。
參考:
Comments on: "[iOS] Apple Sign In (蘋果登錄)" (1)
[…] Apple Login 已滿一年,開始有大量的 @privaterelay.apple.com […]
讚讚