前言
最近 wwdc 2019 之後,我想之後熱門關鍵字少不了 Sign in with Apple , 官方要支援所有平台,並且可以讓使用者選擇要不要揭露 e-mail , 這對保護個資和防廣告真是一大福音。
準備工作
之前自己已自行完成 Sign in with Apple of iOS 的登入實作,沒有感覺特別要處理的事。應該是自家產品的關係吧,用在別的平台才發現有很多不一樣的作法如下 :
- 要先有個Apple ID , 如果有就不需要,申請不難去官方網站就可 , 之後用 apple ID login , 我是用開發者帳號登入 , 之後 user 的 apple ID 跟server的連接就交給後端工程師去處理了 。
- 接下來去申請新的 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 的私鑰
實作登入
<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: 開發人員驗證用可自定義
點擊後出現登入畫面
Get JWT
這裡就是要用 REST API 去跟 Apple 官方交換資料 , 不過首先要先用 ES256 演算法 , 把 team id, key , client id, 轉換出 token , 才能傳送
拿到token後 , 用RESTAPI post 給 Apple 官方 , 成功之後就會在網頁看到 User ID 相關資料
接下來只要在網頁上輸入:
http://127.0.0.1:8080/redirect?code=c23365a9…..&state=4aa3f9fb6f
就可看到解析後的資料
exp : key 到期時間最長半年(秒)
iat : 產 key 時間 ( 秒)
sub : claims 裡面轉換JWT的key,可以知道是不是同一個帳號