How to Sign in with Apple using a web page

劉冠志
6 min readJul 26, 2019

--

前言

最近 wwdc 2019 之後,我想之後熱門關鍵字少不了 Sign in with Apple , 官方要支援所有平台,並且可以讓使用者選擇要不要揭露 e-mail , 這對保護個資和防廣告真是一大福音。

準備工作

之前自己已自行完成 Sign in with Apple of iOS 的登入實作,沒有感覺特別要處理的事。應該是自家產品的關係吧,用在別的平台才發現有很多不一樣的作法如下 :

  1. 要先有個Apple ID , 如果有就不需要,申請不難去官方網站就可 , 之後用 apple ID login , 我是用開發者帳號登入 , 之後 user 的 apple ID 跟server的連接就交給後端工程師去處理了 。
  2. 接下來去申請新的 App IDs, 並且填入內容後,開通 Sign in with Apple

3. 一樣申請新的 services IDs , 等一下要關聯 Bundle ID, 一樣打勾 Sign in with Apple

這邊說明一下:

選項有要填入 Domain , 這是要真的對外可連線的 , 之前偷懶用 localhost 改成 eample.com 以為可以驗證成功 , 後來還是失敗 , 而上面 Return URLs 輸入的網址 : https://example-app.com/redirect 這是 Apple 官方提供驗證是否可以在後台拿到 ID 資料 , 網上也有很多示範後台如何用PHP or Node JS 實作 , 我就不在說明這部分 , 所以我先以手動方式示範給大家看流程 。

4. 申請 User 的私鑰

綁定你的 Bundle ID
注意只能下載一次要保管好如果遺失只能重新申請

實作登入

<script type="text/javascript" src="https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js"></script>

打開瀏覽器輸入:127.0.0.1:8080

官方提供的登入的資料變數

<html>
<head>
</head>
<body>
<script type="text/javascript" src="https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js"></script>
<div id="appleid-signin" data-color="black" data-border="true" data-type="sign in"></div>
<script type="text/javascript">
AppleID.auth.init({
clientId : '[CLIENT_ID]',
scope : '[SCOPES]',
redirectURI: '[REDIRECT_URI]',
state : '[STATE]'
});
</script>
</body>
</html>

說明如下:

clientId : 這是代表 services ID

scope : 目前填入 ‘name email’ 的字串,中間一定要空格

redirectURI : 目前我先以官方的驗證https://example-app.com/redirect,如果有自己網址就可填

state: 開發人員驗證用可自定義

點擊後出現登入畫面

這是第一次登入才會出現選擇顯示或隱藏 Email
每次登入都會看到此畫面

Get JWT

這裡就是要用 REST API 去跟 Apple 官方交換資料 , 不過首先要先用 ES256 演算法 , 把 team id, key , client id, 轉換出 token , 才能傳送

Jwt 轉換程式

拿到token後 , 用RESTAPI post 給 Apple 官方 , 成功之後就會在網頁看到 User ID 相關資料

接下來只要在網頁上輸入:

http://127.0.0.1:8080/redirect?code=c23365a9…..&state=4aa3f9fb6f

就可看到解析後的資料

選擇隱藏Email
選擇顯示Email

exp : key 到期時間最長半年(秒)

iat : 產 key 時間 ( 秒)

sub : claims 裡面轉換JWT的key,可以知道是不是同一個帳號

--

--