構成
- AWS Route53 + ACM + CloudFront + S3
- Universal Links の AASA file は S3 へ配置する.
- ACM は
us-east-1
にて当該証明書を手動で発行する.- ACM を CloudFront で利用する場合は
us-east-1
で作成する必要があるため.
- ACM を CloudFront で利用する場合は
- 構築には Terraform を利用.
アプリログイン -> Universal Link アクセスの流れ
- アプリにログイン
- アプリ API が SAML 認証要求
- Azure AD の IdP へリダイレクト
- Safari Viewが開かれる
- SAML 認証用ユーザー ID , password を入れてログイン
- 端末の証明書と Intune に登録済の証明書を比較し、認証を行う
- アプリ API がログイン成功のレスポンスを返す
- Universal Links のエンドポイントへリダイレクト
xxx.com/.well-known/apple-app-site-association
へリクエスト- Route53 が CloudFront の Domain name (xxx.cloudfront.net) を返す
- CloudFront の Origin Domain (S3) 経由で Universal Link の JSON (
apple-app-site-association
) へアクセス
- Safari view が Universal Link へアクセスし、アプリを起動する
Universal Links 配置要件
AASA file (apple-app-site-accosiation) の配置要件は以下の通り.
- HTTPS 経由でアクセス出来ること
- リダイレクトなしでアクセスが可能であること
Content-Type
はapplication/json
であること。- 署名がある場合は
application/pkcs7-mime
- 署名がある場合は
- 当該オブジェクト (apple-app-site-association) の Metadataで
Cache-Control: no-cache
,no-store
,must-revalidate
を指定.- cache しないようにしないと 304 statusで返る場合があり, 200 statusでレスポンスされない場合アプリ的に Universal Link を kick 出来ない場合がある.
- RFC5785 の実装により iOS 9.3 以上の場合は先ず
/.well-known/
へアクセスしてapple-app-site-association
があるか探し、無ければルートを探す.- ルートに当該のJSONを配置すると、2回リクエストが発生し次のようなアクセスログとなる為, リクエストを1回で済ませ不要な 403 status のログも出ないよう
/.well-known/
配下へ Universal Link を配置する.
- ルートに当該のJSONを配置すると、2回リクエストが発生し次のようなアクセスログとなる為, リクエストを1回で済ませ不要な 403 status のログも出ないよう
yyyy-mm-dd tt:mm:ss xxx 616 0.0.0.0 GET xxx.cloudfront.net /.well-known/apple-app-site-association 403 - Network/901.1%2520Darwin/17.6.0 - - Error == example.com https 256 0.087 - TLSv1.2 xxx Error HTTP/1.1 - - yyyy-mm-dd tt:mm:ss xxx 760 0.0.0.0 GET xxx.cloudfront.net /apple-app-site-association 200 - Network/901.1%2520Darwin/17.6.0 - - Miss == example.com https 244 0.098 - TLSv1.2 xxx Miss HTTP/1.1 - -