SlideShare a Scribd company logo
IDaaSにSign in with Apple
をつないでみた
@phr_eidentity
2019/08/02
#idcon
Copyright 2019 Naohiro Fujie
自己紹介
• 役割
• OpenIDファウンデーション・ジャパン理事、KYC WGリーダー
• IDをコアとしたビジネス開発担当。大阪から全国をカバー
• 書き物など
• Blog:IdM実験室(https://idmlab.eidentity.jp)
• 監訳 : クラウド時代の認証基盤 Azure Active Directory 完全解説
• 共著 : クラウド環境におけるアイデンティティ管理ガイドライン
• その他活動
• 日本ネットワークセキュリティ協会アイデンティティ管理WG
• Microsoft MVP for Enterprise Mobility(Jan 2010 -)
• LINE API Expert (Feb 2018 -)
• Auth0 Ambassador(Sep 2018 -)
Copyright Naohiro Fujie, 2019 2
お題
• まず、はじめに
• Azure AD B2C編
• Auth0編
• 注意点
• まとめ
Copyright 2019 Naohiro Fujie
まず、はじめに
Copyright 2019 Naohiro Fujie
AuthZエンドポイント不明
Copyright 2019 Naohiro Fujie
https://developer.apple.com/documentation/signinwithapplerestapi
まずは標準のJSを使ってみる
• 公式ドキュメントの通り
• https://developer.apple.com/documentation/signinwithapplejs/configuring_your_webpage_for_sign_in_with_apple
<html>
<head>
<meta name="appleid-signin-client-id" content=“{client}">
<meta name="appleid-signin-scope" content="name email">
<meta name="appleid-signin-redirect-uri" content="https://{your_redirect_uri}">
<meta name="appleid-signin-state" content="hogehoge">
</head>
<body>
<div id="appleid-signin" data-color="black" data-border="true" data-type="sign in"></div>
<script type="text/javascript" src="https://appleid.cdn-
apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js"></script>
</body>
</html>
Copyright 2019 Naohiro Fujie
まずは標準のJSを使ってみる
• 認可リクエストを覗いてみる
• Hybrid, scopeはname email, form_post
https://appleid.apple.com/auth/authorize?
client_id={client}&
redirect_uri=https%3A%2F%2F{redirect_uri}&
response_type=code%20id_token&
state=hogehoge&
scope=name%20email&
response_mode=form_post&
frame_id=cce20447-06fb-47cc-92bf-ca85f87febc3&
m=21&
v=1.1.6
Copyright 2019 Naohiro Fujie
まずは標準のJSを使ってみる
• 認可レスポンス(redirect_uriへPOSTされてくる)
state: hogehoge
code: cb5ce09e14e9a4d7cb7b9cdc95c0d82ab.0.nsqtx.5pH1elbG5qgYO4GJHLMQwg
id_token:
eyJraWQiOiJBSURPUEsxIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwczovL2FwcGxlaWQuYXBwbGUuY29tIiwiYX
VkIjoidmluLnJlaXdhLmNs~~省略~~Zw6ToHn_uXOKXRS4lkFguFldNRKPYahVZk_RZ4_UEfZBAYEyvkxxngl8-
_5Yp6L1e39p6t9apnHquj9J80K0N45WNDdj2erF_NUGtmKZQRdqbs9sA0BxbrJVyyJIGrOPO0A6sl-3Lt7LBvHyZg
user: {"name":{"firstName":"Naohiro","lastName":"Fujie"},"email":“xxx@xxxx.jp"}
Copyright 2019 Naohiro Fujie
まずは標準のJSを使ってみる
• Id_tokenの中身を覗いてみる
• c_hashは無い・・・
{
"iss": "https://appleid.apple.com",
"aud": “{client}",
"exp": 1564639728,
"iat": 1564639128,
"sub": "002037.b50e1026dfac4f1db61c47b2095a2928.1501",
"email": “xxx@xxxx.jp"
}
ちなみにsubのスコープは
Teamっぽい
Copyright 2019 Naohiro Fujie
まずは標準のJSを使ってみる+α
• 返ってきたcodeを使ってtokenエンドポイントを叩いてみる
• https://appleid.apple.com/auth/token *これはドキュメントに書いてある
POST /auth/token HTTP/1.1
Host: appleid.apple.com
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&
code=c8117807ab9514cb8b7ab21a6b4422053.0.nsqtx.sviy07qmCL418BjyY4zKVQ&
client_id={client}&
client_secret=eyJhbGciOiJFUzI1NiIsInR~~省略~~F0Tj0TddkrPLIQ
redirect_uri=https%3A%2F%2Fb2cline.azurewebsites.net%2Fapplejs.php
client_secretの作り方は後程
Copyright 2019 Naohiro Fujie
まずは標準のJSを使ってみる+α
• トークンレスポンス
{
"access_token": "aeed1e957c03e4992bcda1d5f5db74730.0.nsqtx.40F_OL_3UR_QgCqeCGzwbA",
"token_type": "Bearer",
"expires_in": 3600,
“refresh_token”: “r58fb1260e21e4ed09d6b~~省略~~PpcIOA7HFcwxYzCiqg",
“id_token”:
“eyJraWQiOiJBSURPUEsxIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwczovL2FwcGxlaWQuYXBwbGUuY29tIiwiY
XVkIjoidmluLnJlaXdhLmNsaWVudCIsImV4cCI6MTU2NDY0MTEwMCwiaWF0IjoxNTY0NjQwNTAwLCJzdWIiOiIwM
DIwMzcuYjUwZTEw~~省略~~qb_OQMCsNLWdu1-
21gxtpD2pAeF3bEYed8dOoyxj9u9wNujyg7RVbHCKRPazMx8Hwcvp8W-aU-HpUVxkFl5_qFHY_6rm-
Q0MteUezGRWbhwpAubpS5husq9gc33S_dsc-p1wpSe3nsvIg2uPVU_vwrBn_zwAFknTqI-
4ym_V1fBE9w_2e56qyfJEK9Qew"
}
Copyright 2019 Naohiro Fujie
まずは標準のJSを使ってみる+α
• Id_tokenの中身を覗いてみる
• at_hashはある
{
"iss": "https://appleid.apple.com",
"aud": “{client}",
"exp": 1564640650,
"iat": 1564640050,
"sub": "002037.b50e1026dfac4f1db61c47b2095a2928.1501",
"at_hash": "Z2Bmd-29JWvbo_mqohgqow",
"email": “xxx@xxxx.jp"
}
Copyright 2019 Naohiro Fujie
この流れを踏まえてIDaaSに組み込む
• ここまででわかったこと
• エンドポイントは以下の通り
• 認可エンドポイント:https://appleid.apple.com/auth/authorize
• トークンエンドポイント: https://appleid.apple.com/auth/token
• userInfoエンドポイントは見当たらない
• form_postでid_tokenと一緒にuser情報が返ってくる
• 試したIDaaS
• Azure AD B2C
• Auth0
Copyright 2019 Naohiro Fujie
Azure AD B2C編
Copyright 2019 Naohiro Fujie
とりあえずカスタムOPとして追加
まだ標準プロバイダとして
プリセットは存在しない
2019年8月時点の標準IdP:
Amazon, Facebook, Google, QQ, github, WeChat, twitter,
Weibo, Microsoft, LinkedIn
Copyright 2019 Naohiro Fujie
Apple側のServices Id設定
• Return URLsには以下を設定する
• https://login.microsoftonline.com/te/{テナント名}.onmicrosoft.com/oauth2/authresp
• https://{テナント名}.b2clogin.com/{テナント名}.onmicrosoft.com/oauth2/authresp
Copyright 2019 Naohiro Fujie
さっそく壁にあたる
①/.wellknown/openid-
configurationが必須
{
"authorization_endpoint": "https://appleid.apple.com/auth/authorize",
"issuer": "https://appleid.apple.com",
"token_endpoint": "https://appleid.apple.com/auth/token",
"jwks_uri": "https://appleid.apple.com/auth/keys"
}
仕方がないので作る
注)URLが.wellknown/openid-configuration
で終わる必要あり
②client_secretが必要 作る(次ページ)
③response_typeに「code
id_token」がない
どちらかに設定して試す
Copyright 2019 Naohiro Fujie
client_secretの作り方
• Appleからダウンロードした鍵で署名したJWTを使う
{
"alg": "ES256",
"typ": "JWT“,
“kid": “{key_id}“
}.{
"sub": “{client_id}",
"nbf": 1560203207,
"exp": 1560289607,
"iss": “{TeamId}",
"aud": "https://appleid.apple.com"
}.[Signature]
基本構造
const jwt = require("jsonwebtoken");
const fs = require("fs");
const privateKey = fs.readFileSync("./authkey.p8");
const token = jwt.sign({}, privateKey, {
algorithm: "ES256",
expiresIn: "60 days",
audience: "https://appleid.apple.com",
issuer: “{TeamId}",
subject: “{client_id}",
keyid: “{key_id}"
});
console.log("The token is:", token);
Auth0の人が書いてたスクリプト
The token is: eyJhbGciOiJFUzI1NiIsInR5ccs~~省略~~z-F0Tj0TddkrPLIQ
Apple Developerサイトで
作ったキーファイル
Apple Developerサイトで
確認できるTeam Id
Apple Developerサイトで
作ったキーのId
これをclient_secretとして
使う
Copyright 2019 Naohiro Fujie
注意事項
• client_secretには期限がある(最大6か月)
const jwt = require("jsonwebtoken");
const fs = require("fs");
const privateKey = fs.readFileSync("./authkey.p8");
const token = jwt.sign({}, privateKey, {
algorithm: "ES256",
expiresIn: "60 days",
audience: "https://appleid.apple.com",
issuer: “{TeamId}",
subject: “{client_id}",
keyid: “{key_id}"
});
console.log("The token is:", token);
{
"alg": "ES256",
"typ": "JWT",
"kid": "Q55XN53AWU"
}.{
"iat": 1564635617,
"exp": 1569819617,
"aud": "https://appleid.apple.com",
"iss": "D89GDBS69B",
"sub": “{client}"
}
絶対忘れると思う
Copyright 2019 Naohiro Fujie
response_type問題:codeで
• response_type=code • response_type=id_token
Copyright 2019 Naohiro Fujie
属性情報をどうやってとるか?
• これで認可リクエストを発行
• response_type=code
• response_mode=form_post
• 一応user属性は返ってきている
• が、Azure AD B2Cのredirect_uriが受け取れるはずもなく…
state: StateProperties=eyJTSUQiOiJ4LW~~省略~~CJpJp93DjhQJO4A7UMQ
user: {"name":{"firstName":"Naohiro","lastName":"Fujie"},"email":“xxx@xxxx.jp"}
Copyright 2019 Naohiro Fujie
カスタムポリシーだとどうか?
• 良いところ
• METADATAのURLが割と自由(.well-
known/openid-configurationで終わら
なくても良い)
• response_typeが自由に決められる
• でも結局ユーザ属性は取れない
• ちなみにプロトコルをOAuthにすると
追加パラメータとかも使えるが、
response_modeが使えなくなる(無
視される)。codeだしそりゃそうで
す。
Copyright 2019 Naohiro Fujie
Auth0編
Copyright 2019 Naohiro Fujie
ビルトインで用意されている(ベータ)
ビルトイン版がある!
ちなみにredirect_uriは
標準で
https://{テナント名}.auth0.com/login/callback
カスタムドメインの場合は
https://{カスタムドメイン名} /callback
Copyright 2019 Naohiro Fujie
とりあえず試せる
設定せずに使い始めることができる(な
にも設定しないとAuth0がとった開発用の
clientが使われる)
Copyright 2019 Naohiro Fujie
client_secretの期限問題がない(と思う)
署名用のキーをそのまま張り付けるだけ
なので、自前でclient_secretを作らなく
てよい。多分期限もちゃんと考えて毎回
or 定期的に作ってくれていると思う
Copyright 2019 Naohiro Fujie
response_typeはcode, modeなし
• 認可リクエスト
• scope=name email
• response_type=code
• reponse_modeなし(当然ですが)
GET /auth/authorize?
client_id={client}&
scope=name%20email&
response_type=code&
redirect_uri=https%3A%2F%2F{tenant}.auth0.com%2Flogin%2Fcallback&
state=LGN0AZlHg1JZapo-4V3AEhFgd0ioBnTk
HOST: appleid.apple.com
Copyright 2019 Naohiro Fujie
当然フロントにはid_tokenもuserもない
• そりゃそうです。
GET /login/callback?
code=c48df4947c13148f4885ee2d4a7aa80f5.0.nsqtx.JJ7XoU5YaYvVjOupQLZcog&
state=gS2mgYI7FL0FKBGVbq-cIz7IZeZc79Tz
HOST: {tenant}.auth0.com
Copyright 2019 Naohiro Fujie
メールアドレスは取れているので、バッ
クエンドでid_tokenを取ってます
• 普通のcode flowです
Copyright 2019 Naohiro Fujie
カスタム・ソーシャル・コネクタを作る
• OAuthエクステンション
• カスタム設定が可能
• あくまでOAuth…
Copyright 2019 Naohiro Fujie
必要な情報を設定~ユーザ属性取得
• access_tokenまではとって来るの
で後は自分でuserInfoをたたく
• Apple Idの場合はUser Profileが取
れるエンドポイントがないので、
やはりid_tokenに頼る
• ctx.id_tokenでコンテキストから
id_tokenが取れるのでdecode
• ctx.userとかできれば嬉しいので
すが、結局userはform_postが前
提なので、無理
client_secret問題再び
Copyright 2019 Naohiro Fujie
注意点
Copyright 2019 Naohiro Fujie
メールアドレス、ユーザ属性は初回のみ
state: hogehoge
code: cb5ce09e14e~~省略~~lbG5qgYO4GJHLMQwg
id_token: eyJraWQ~~省略~~OPO0A6sl-3Lt7LBvHyZg
user:
{"name":{"firstName":"Naohiro","lastName":"Fujie"},"email
":“xxx@xxxx.jp"}
state: hogehoge
code: cb5ce09e14e~~省略~~lbG5qgYO4GJHLMQwg
id_token: eyJraWQ~~省略~~OPO0A6sl-3Lt7LBvHyZg
初回の認可レスポンス 2回目以降の認可レスポンス
{
"iss": "https://appleid.apple.com",
"aud": “{client}",
"exp": 1564639728,
"iat": 1564639128,
"sub":
"002037.b50e1026dfac4f1db61c47b2095a2928.1501",
"email": “xxx@xxxx.jp"
}
初回のid_token
{
"iss": "https://appleid.apple.com",
"aud": “{client}",
"exp": 1564639728,
"iat": 1564639128,
"sub":
"002037.b50e1026dfac4f1db61c47b2095a2928.1501"
}
2回目以降のid_token
Copyright 2019 Naohiro Fujie
https://appleid.apple.comで認可取消
Copyright 2019 Naohiro Fujie
まとめ
• IDaaSではSDKは使えないので、OpenID Connect?で接続
• ユーザ属性はform_postでid_tokenと一緒に飛んでくるが、実
際イレギュラーすぎてIDaaSでは取得できない(たぶん)
• メールアドレスはid_tokenから
• ユーザ属性もメールアドレスも取れるのは初回認可時だけ
• client_secretのキーローテーションには気を付けること
• Auth0のビルトインは大丈夫っぽい(たぶん)
Copyright 2019 Naohiro Fujie

More Related Content

PDF
Sign In with Apple概要 iOSでの実装方法検討 #idcon
PPTX
AAD B2Cでゆるっと真面目に認証しよう【Interact2019】
PDF
認証の課題とID連携の実装 〜ハンズオン〜
PDF
OpenID ConnectとAndroidアプリのログインサイクル
PDF
Azure ADと外部アプリのID連携/SSO - Deep Dive
PDF
実装して理解するLINE LoginとOpenID Connect入門
PDF
20231109_OpenID_TechNight_OpenID_Federation.pdf
Sign In with Apple概要 iOSでの実装方法検討 #idcon
AAD B2Cでゆるっと真面目に認証しよう【Interact2019】
認証の課題とID連携の実装 〜ハンズオン〜
OpenID ConnectとAndroidアプリのログインサイクル
Azure ADと外部アプリのID連携/SSO - Deep Dive
実装して理解するLINE LoginとOpenID Connect入門
20231109_OpenID_TechNight_OpenID_Federation.pdf

What's hot (20)

PDF
池澤あやかと学ぼう!: はじめてのOAuthとOpenID Connect - JICS 2014
PPTX
Azure API Management 俺的マニュアル
PPTX
Azure ADアプリケーションを使用した認証のあれやこれ
PDF
【第1回EMS勉強会】Autopilot設計時のポイント
PDF
ID & IT 2013 - OpenID Connect Hands-on
PDF
今更聞けない電子認証入門 - OAuth 2.0/OIDCからFIDOまで -
PDF
J-3:アジャイルな経営(組織運営)のために 必要な3つのこと(ともう少し深いところの話)
PDF
これからのネイティブアプリにおけるOpenID Connectの活用
PDF
Confluence と SharePoint 何が違う?
PDF
OpenIDConnectを活用したgBizID(法人共通認証基盤)の現状と今後の展望 - OpenID Summit 2020
PDF
【16-E-4】残業ゼロで開発スピードが10倍に!もう元の開発体制には戻れないデンソー流のアジャイル開発
PDF
Insight into Azure Active Directory #02 - Azure AD B2B Collaboration New Feat...
PDF
SSIとDIDで何を解決したいのか?(β版)
PDF
Azure ADとIdentity管理
PDF
” AWS ” だけじゃない! ” GCP ” の オートスケール機能
PDF
OAuth / OpenID Connectを中心とするAPIセキュリティについて #yuzawaws
PDF
PDSを実現するにあたっての技術動向の紹介 (OAuth, OpenID Connect, UMAなど)
PPTX
HoloLens開発環境構築(2018/1版)
PPTX
Cloud Firestore を使って、Polling をやめたい話
PDF
Fido認証概要説明
池澤あやかと学ぼう!: はじめてのOAuthとOpenID Connect - JICS 2014
Azure API Management 俺的マニュアル
Azure ADアプリケーションを使用した認証のあれやこれ
【第1回EMS勉強会】Autopilot設計時のポイント
ID & IT 2013 - OpenID Connect Hands-on
今更聞けない電子認証入門 - OAuth 2.0/OIDCからFIDOまで -
J-3:アジャイルな経営(組織運営)のために 必要な3つのこと(ともう少し深いところの話)
これからのネイティブアプリにおけるOpenID Connectの活用
Confluence と SharePoint 何が違う?
OpenIDConnectを活用したgBizID(法人共通認証基盤)の現状と今後の展望 - OpenID Summit 2020
【16-E-4】残業ゼロで開発スピードが10倍に!もう元の開発体制には戻れないデンソー流のアジャイル開発
Insight into Azure Active Directory #02 - Azure AD B2B Collaboration New Feat...
SSIとDIDで何を解決したいのか?(β版)
Azure ADとIdentity管理
” AWS ” だけじゃない! ” GCP ” の オートスケール機能
OAuth / OpenID Connectを中心とするAPIセキュリティについて #yuzawaws
PDSを実現するにあたっての技術動向の紹介 (OAuth, OpenID Connect, UMAなど)
HoloLens開発環境構築(2018/1版)
Cloud Firestore を使って、Polling をやめたい話
Fido認証概要説明
Ad

Similar to IDaaSにSign in with Appleをつないでみた (11)

PPTX
キーチェーン・アクセスのバックアップと同期
PDF
Welcome sign in with apple
PDF
OpenID Connect入門
PDF
OpenStack Study#9 JOSUG
PDF
[20140625]wwdc2014 feedback
PDF
OpenID Connect - Nat Sakimura at OpenID TechNight #7
PDF
OAuth2.0によるWeb APIの保護
PDF
Authentication and Authorization of The Latest Keycloak
PPTX
Idcon25 FIDO2 の概要と YubiKey の実装
PPTX
QlikTips: Qlik Cloud REST APIでユーザー登録(Node.js)
PPTX
認証サービスへのWebAuthnの導入
キーチェーン・アクセスのバックアップと同期
Welcome sign in with apple
OpenID Connect入門
OpenStack Study#9 JOSUG
[20140625]wwdc2014 feedback
OpenID Connect - Nat Sakimura at OpenID TechNight #7
OAuth2.0によるWeb APIの保護
Authentication and Authorization of The Latest Keycloak
Idcon25 FIDO2 の概要と YubiKey の実装
QlikTips: Qlik Cloud REST APIでユーザー登録(Node.js)
認証サービスへのWebAuthnの導入
Ad

More from Naohiro Fujie (20)

PDF
分散型IDと検証可能なアイデンティティ技術概要
PDF
今なら間に合う分散型IDとEntra Verified ID
PDF
LINE Login総復習
PDF
Azure AD B2CにIdPを色々と繋いでみる
PDF
LINEログインの最新アップデートとアプリ連携ウォークスルー
PDF
ざっくり解説 LINE ログイン
PDF
Azure AD x LINE x Auth0
PDF
LINE Payも取り組んでいるKYCってなんだろう?KYCの基本と最近の動向
PDF
MicrosoftのDID/VC実装概要
PDF
LIFFとの連携でさらに強力に。こんなに使えるLINEログイン
PDF
自己主権型IDと分散型ID
PDF
Azure ADの外部コラボレーションとBYOID
PDF
祝!公式サポート Auth0 + LINE Login
PDF
次世代KYCと自己主権型アイデンティティの動向
PDF
これからの KYC と Identity on Blockchain の動向
PDF
教育機関におけるBYOIDとKYC
PDF
組織におけるアイデンティティ管理の基本的な考え方
PDF
コンシューマIDのエンタープライズ領域での活用
PDF
大学等におけるAzure AD B2Cを使用したSNS認証の活用
PDF
Azure AD B2C + LINE 学校や企業における次世代 ID/ メッセージ基盤
分散型IDと検証可能なアイデンティティ技術概要
今なら間に合う分散型IDとEntra Verified ID
LINE Login総復習
Azure AD B2CにIdPを色々と繋いでみる
LINEログインの最新アップデートとアプリ連携ウォークスルー
ざっくり解説 LINE ログイン
Azure AD x LINE x Auth0
LINE Payも取り組んでいるKYCってなんだろう?KYCの基本と最近の動向
MicrosoftのDID/VC実装概要
LIFFとの連携でさらに強力に。こんなに使えるLINEログイン
自己主権型IDと分散型ID
Azure ADの外部コラボレーションとBYOID
祝!公式サポート Auth0 + LINE Login
次世代KYCと自己主権型アイデンティティの動向
これからの KYC と Identity on Blockchain の動向
教育機関におけるBYOIDとKYC
組織におけるアイデンティティ管理の基本的な考え方
コンシューマIDのエンタープライズ領域での活用
大学等におけるAzure AD B2Cを使用したSNS認証の活用
Azure AD B2C + LINE 学校や企業における次世代 ID/ メッセージ基盤

IDaaSにSign in with Appleをつないでみた