Sign In With Apple

已經實作完滿久一陣子,但一直沒有時間寫文章,來補債了。

網上還滿多實作文章都滿清楚的,所以我覺得不難理解本章節。

原由:

  • WWDC 2019 年度表示上架審核的規範內加入了新的條款,若App有使用第三方登入,就得必須也放上 Sign In with Apple 的選項,否則將會被 退貨;而可以例外的為:企業內部的App、教育性質的 App 。
  • 但他們認為Apple Account 是簡化註冊帳號的方法,需為註冊依據,而非依附主帳號作為登入的輔助功能,否則有可能被退件,但如果App有特殊原因無法將Apple Account作為主要帳號(只能得到email,不包含手機號碼部分),可向蘋果爸爸反應看看。
  • WWDC2020 已經提供將原有帳號升級為 Sign In with Apple,其為了提升元帳戶的安全性,不再透過輸入密碼方式。
  • 透過Apple ID登入或註冊某網站或App後,所有的紀錄和資訊都保留在手機或iCloud上,並做加密保護。

保障:

  • Streamlined account setup(簡化帳戶設置):將Apple account作為會員帳號。
  • Verified email address(保護使用者隱私):僅提供開發商name、email,而email也可選擇隱藏,Apple 將建立中介email)
  • Cross-platform(可運行在任何平台): 除了 iOS、macOS、tvOS、watchOS 外,也可支援 Web Browser。
  • Anti-fraud (反詐欺):防止機器人, Apple 會使用機器語言學習方式來判斷登入的使用者是否為真人,假設說不是,Apple 會寄送警告訊息給開發者

實作有三種方式:

  1. 使用 iOS13 的 SDK AuthenticationServices Framework:其只要使用 Xcode11 的 AuthenticationServices Framework SDK ,但只限於在 iOS13 執行
  2. 使用 Sign In with Apple JS:透過撰寫 Java Script 達成,不再不侷限在 iOS13& iOS,以 WebView方式,通常由後端人員開發,前端人員只要將其嵌入 WebView。所以,不侷限在 iOS,連 Android 和 WebSite 都適用
  3. 使用 Sign In with Apple API:透過呼叫 Apple 提供的 API 實作,此方式因為安全性的考量,要多次呼叫不同的 API 方可達到,實作上並沒相像中的容易,同 JS 也不侷限在 iOS,連 Android 和 WebSite 都適用
    。非蘋果用戶得事先申請一個Apple ID。
    。只有要讓 iOS App 支援 Sign in with Apple 部分,如果你的服務是跨平臺,希望讓 Web、Android 也能支援的話,需要在 Apple Developer 上再新建一個 Services ID,然後利用官方提供的 JS Library 或自己串接官方的 API Endpoints。
    需要在 Apple Developer 上再新建一個 Services ID,然後利用官方提供的 JS Library 或自己串接官方的 API Endpoints。

Apple account之限制:

  1. iOS 13 or later. (安裝 iOS 13 以上、iPadOS 13 以上、macOS Catalina 10.15 以上的 Apple 裝置)
  2. An Apple ID that uses two-factor authentication.(使用雙重認證的 Apple ID。)
  3. To be signed in to iCloud with your Apple ID. (已在您的 Apple 裝置上使用這個 Apple ID 登入 iCloud。)

Apple account可提供資訊:

- 打問號的部分是重新授權前都不會再提供(保障個資),若開發商需要此資訊需要自行存起來。
- UserID 在同一個開發商底下將會提供相同的值。

  • Authorization Code
  • Identity Token
  • Email ?
  • UserID
  • Name?

實作流程:

用戶點擊按鈕事件> 授權當前App > 經過Apple官方認證> 執行下一步事件
  1. 從 Apple Developer 後台開啟 Sign In with Apple 的 Capability。

2. 新增 Entitlement,為App加入Capabilities。

3. 該專案import AuthenticationServices

4. 由於只支援iOS 13 以上的版本,故需控制按鈕是否可使用

5.requestedScopes: 彈跳出需授權的欄位

ASAuthorizationController 置入request,透過performRequset() 叫出。

6.遵從ASAuthorizationControllerDelegate,回傳將觸發delegate
ASAuthorizationAppleIDCredential 內含有使用者資訊。

IdentifierToken (JSON Web Token)且具有時效性:
- sub: 為UserIdentifier
- nonce: 需要驗證是否與當初request時相同
-email: 若當初requestedScopes含有email欄位,則亦包含在identifierToken
-real_user_status: 0: unsupported, 1 : unknown,2 :likely real。首次授權App時返回。

identifierToken decoded in your server

IdentifierToken需要搭配Apple提供的public key與Apple ID Servers進行驗證,並取回兩項東西:
- accessToken
- refreshToken(一天只能使用一次)

7.遵從ASAuthorizationControllerPresentationContextProviding,欲顯示的window

8.亦可檢查當前授權狀態

case .authorized: Apple account已登入,且為授權狀態。
case .revoked: 用戶撤銷授權或用戶已登出
Apple account
case .notFound:
Apple account 查無此用戶。
case .
transferred: 開發團隊的改變,才會有的類別。

設定查看手機目前授權狀態:

1.設定 > Apple 帳戶

密碼與安全性

2. 使用Apple ID 的App

使用Apple ID 的App

3. 授權中App列表 > 選取欲查看者

可查看授權中App列表

4. 可看到該App授權中,且為隱藏email方式,如果想要撤銷Apple ID 授權點選「停止使用Apple ID」,讓該App 只能重新向使用者申請授權。

可透過ASAuthorizationAppleIDProvider method檢查當前授權狀態,亦可加上NotificationCenter.addObserver 去監聽變動狀態。

forName: ASAuthorizationAppleIDProvider.credentialRevokedNotification

Server To Server Notifications:

  1. 註冊server end point 在Apple Developer website
  2. 將會收到以JSON Web Token形式的事件
    範例email-disabled事件,使用者終止接收郵件,使用private email。
    反之,e-mail-enabled事件,使用者啟用接收郵件。
email-disabled事件

consent-revoked事件,使用者撤銷此App授權

consent-revoked事件

account-delete事件,使用者要求Apple刪除Apple ID,且userIdentifier失效。

account-delete事件

可以幫我點個讚,或是分享一杯咖啡支持我。

--

--

奇妙仙子
彼得潘的 Swift iOS / Flutter App 開發教室

When you want something, all the universe conspires in helping you to achieve it.