ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Appleでサインインの最大活用
Appleでサインインを使用すると、ユーザーは既に持っているApple IDでAppやWebサイトに簡単にサインインできるようになります。安全なリクエストを使用し、状態変更とサーバ通知を管理することで、AppleでサインインをAppに完全に組み込みましょう。ここではさらに、既存のユーザーがすばやく簡単にAppleでサインインに切り替えることを可能にする新しいAPIをご紹介します。
リソース
- Human Interface Guidelines: Sign in with Apple
- Implementing User Authentication with Sign in with Apple
- Sign In with Apple
関連ビデオ
WWDC22
WWDC21
WWDC20
WWDC19
-
ダウンロード
こんにちは WWDCへようこそ “Appleでサインインの最大活用” “Appleでサインインの最大活用” セッションへようこそ アルフォンゾです 今日はジョナサンと一緒に― Appleでサインインで 新たに導入した項目について話します この機能を使えばアプリケーションに 素早く簡単にサインインできます パスワードも不要なので ユーザーには使いやすいと好評です ユーザーの半数以上がプライベート メールリレーサービスを利用しています Appleでサインインでは― ワンタップでアプリケーションを使い アカウントを作成できるようになりました 昨年のWWDCのセッション “Introducing Sign in with Apple”では― この機能をアプリケーションに追加する方法を お見せしています 今日はいくつかのトピックがあります 最初は認可リクエストと その安全性を高める方法です 次はアプリケーションで資格情報の 状態が変わった際のベストプラクティス デベロッパ向けの新しい サーバ間通知に関してや― Appleでサインインボタンの 追加と変更についても触れます 最後は Appleでサインインへの アップグレードについて説明します ユーザーにとってセキュリティは重要です これはAppleでサインインの開発でも 重視した点です Appleでサインインでは― すでに自動2ファクタ認証などの セキュリティ機能を提供しています しかしリクエストを より安全にする方法があるのです 認可リクエストを作成するための ベストプラクティスを紹介し― セキュリティ機能を 最大限に活用する方法についても話します
これはSwiftを使い 認可リクエストを作成する方法の例です Appleでサインインを実装したことがあれば 見覚えがあるはず
AppleのButtonPressで サインインを処理するメソッドで― 認可リクエストと コントローラをここに用意します
リクエストのプロパティを変更し requestedScopesなどを追加できます 名前やメールアドレスなど ユーザー情報が必要な場合に有効です
認証プロセスをより安全にするのに役立つ いくつかのプロパティがあります “nonce”と“state”です
これらのプロパティにより リクエスト実行後に取得する認証と その情報が期待どおりかを確認できます このプロパティについて話しましょう nonceはリクエストで文字列として送信される データの不透明なblobです 新規リクエストの作成のたびに 固有のnonceを1つ生成しておけば― 後ほど この値を確認できるようになります
nonceの値は 認証情報のidentityTokenの プロパティに埋め込まれ 返されます
するとサーバでこの値を確認でき 反射攻撃を防ぐことができます
nonceと同様 stateの値も リクエストで送信されたデータのblobです nonceの値との大きな違いは1つ stateが資格情報内で返されると― 資格情報とリクエストをローカルで照合し アプリケーションから生成されたか確認できます この追加プロパティにより― ユーザーにリクエストを提示するよう コントローラに要求する準備ができます
ユーザーは このような認可リクエストを目にします メールアドレスが リクエストされた場合― メールアドレスを共有するか 非表示にするか 選択を求められます メールアドレスを非表示にすると― プライベートメールリレーを 受け取ります ここで疑問も出るでしょう “プライベートメールリレーとは?” “メールアドレスの確認方法は?” “ユーザーからの返信が必要な場合は?” その答えを見ていきましょう
メールリレーはメールアドレスと同様 Team scopeです 開発者固有のものですが― ユーザーに見えるメールアドレスは すべてのアプリケーションで共通となります
メールリレーは― ユーザーの所有だとAppleが確認したアドレスに メールをルーティングします つまりメールアドレスの確認については 心配無用なのです
また必要な場合には ユーザーはメールに返信できます ダウンタイムはないので 電子メールの送受信はいつでもできます ご覧のとおりメールリレーは ユーザーにとって優れた選択肢であり― ユーザーと開発者の 快適なコミュニケーションを維持します プライベートメールリレーを使うユーザーの 選択を尊重しましょう ユーザーが選択をすると認証が進められます 認証が成功すると 認可コントローラの デリゲートメソッドで資格情報を受け取ります これはauthorizationから 資格情報を取得する方法の例です 表示された資格情報には― 名前やメールアドレスなど ユーザー情報を含むプロパティが見られます
これに加え リクエストを安全に検証し サーバとのセッションを作成できる― 重要なプロパティもあります stateとidentityTokenと authorizationCodeです 名前やメールアドレスなど パラメータのいくつかは― アプリケーションを初めて認証した時にのみ 資格情報に含まれます
必要なオブジェクトを キャッシュにすることが重要です 接続不良でサーバとの通信が 切断されることもありますが 重要な情報の損失を防ぐことができます
資格情報のstateの値は 前の値と同じかを確認してください
前述のとおり 応答にはauthorizationCodeと identityTokenが含まれています これらの値をサーバに送信し デコードできるようにしましょう
デコードしたら受信情報と Appleサーバとのセッションを確認します サーバでデコードされたidentityTokenが どうなるか見ましょう 取得できる値はご覧のとおりです “sub”は― authorization内で返されたユーザー識別子です これでサーバ内でセッションを作成できます “nonce”は前述のとおり とても重要な値です リクエスト以前に生成したnonceと 同じものかは確認してください これによりauthorizationの信頼性を確認し 反射攻撃を軽減できます
メールアドレスを要求した場合は identityTokenにも含まれます
“real_user_status”はユーザーが アプリケーションを認証した時に返されます 未サポートは“0” 不明の場合“1” リアルであれば“2”と出ます identityTokenは JSON Web Tokenであり― authorizationに関連する いくつかの情報が含まれています
その情報を得た段階で― Appleで入手できるパブリックキーを使い トークンを検証します トークンの有効期限も確認しておきましょう
AppleIDサーバとauthorizationCodeを 交換できたら― 今後の呼び出しのため リフレッシュトークンと アクセストークンを受け取ります すでに持っているものと同一のIDトークンも 受け取ります
リフレッシュトークンは 1日に1回 確認すれば― デバイス上のApple IDが 良好な状態かを確かめられます ベストプラクティスに従えば スムーズなサインインを提供できるだけでなく 中に含まれるauthorizationや情報が 有効かつ安全であることを確かめられます 認証プロセスを説明したので― アプリケーションの資格情報の状態を 確認する際のベストプラクティスも見ましょう ここで使うのが “getCredentialState”APIです 格納されているユーザー識別子を送信して 資格情報の現在の状態を検証し― ユーザーが このデバイスとアプリケーションに サインインしているか確認できるAPIです セッションを続行して問題ないか 確かめるのに役立ちます 起動時やフォアグラウンドで変更がある時に 呼び出すことが重要です ステータスの変化にリアルタイムで反応し― アプリケーションの適切な画面を ユーザーに提示できます
このAPIを呼び出し 受け取ることのできる既知のstateです もう一度 それぞれのケースについて 何をすべきか見てみましょう
“authorized”となっていれば ユーザーのアプリケーションを直接 追跡でき ログインUIはスキップできます
“revoked”はユーザーの サインアウトを意味します この場合はユーザーを アプリケーションからサインアウトさせ― セッションを閉じ ログイン画面を表示します “notFound”はユーザーIDと 一致する資格情報がない場合に返されます ログイン画面を表示し ユーザーが アプリケーションを認証できるようにします 最後に新しいstateがあるのが 見えるでしょうか “transferred”です このcredentialStateの 処理方法について話しておきましょう
Transferred credentialStateは― 開発チーム間で直近に転送された アプリケーションでだけ受信が可能です 会社が買収された後などに使われます
ユーザー識別子はチームに固有のものです アプリケーションの所有権を譲渡する際は― 新たなチームと一致させるため 別のIDに移行する必要があります
移行はユーザーの操作なしで 静かに処理されます 新規アカウント作成やユーザーのログインの際と 同じAPIを呼び出せば 実行されます ご覧のとおり新旧のアカウントのコードは 同一のものです
現在 格納されているユーザー識別子を リクエストに追加することで― ユーザーの転送状態を検証できます そして新チームと一致する 新たなユーザー識別子を生成します
応答はAuthorizationControllerの デリゲートメソッドで返されます ユーザーは変更に気づくことなく アプリケーションを引き続き使用できます Appleでサインインに今年 導入した 新機能についても話しましょう まずは開発者向けサーバ間通知です 通知によりcredentialStateの変更などを サーバで直接 確認できます 他のイベントと同じように通知されます 通知の受信を開始するプロセスは簡単です まずApple Developerのサイトで サーバのエンドポイントを登録すると― イベントの通知の受信を開始する準備が整います
イベントはAppleが署名した JSON Web Tokenとして送信されます トークンがどう見えるかを説明します JSON Web Tokenには 重要な情報が含まれています 発行者やアプリケーションのバンドルIDなどです これは“email disabled”イベントの例で― ユーザーがメールリレーでのメール受信を 停止すると決定した場合に取得されます
“email enabled”イベントはユーザーが メール受信を選択したことを意味します このイベントはemail disabledと同様で― プライベートメールリレーを使用すると ユーザーが決定した場合にのみ送信されます “consent revoked”イベントは― ユーザーがアプリケーションでのApple IDの 使用の停止を決めた時に送信されます ユーザーのサインアウトとして 扱う必要があります この通知を受け取る可能性があるのが― 設定からユーザーがアプリケーションを 切り離すと決めた時です “account delete”イベントは― ユーザーがAppleに IDの削除を要求した時に送信されます この通知を受け取ると― ユーザーに関連づけられたユーザー識別子は 無効になります このとおり これらの通知を開くことで― 4つの異なるシナリオに対して サーバから適切な対処ができるのです それでは別の新機能についても お話ししましょう SwiftUIのAppleでサインインボタンです SwiftUIを使えばAppleでサインインボタンを 簡単に表示できます それだけでなく SwiftUI APIは 認可リクエストの作成にも役立ちます 同じコードブロック内での応答の処理も同様です ご覧のとおり ボタンの作成は非常に簡単です SignInWithAppleButtonオブジェクトを追加し ラベルを指定するだけです ここでは“signIn”を選択しましたが― “Continue”や“SignUp”を 選択することもできます その後には リクエストを作成できる “onRequest”クロージャがあります 以前 Swiftで見たように― 名前やメールアドレスのような “requestedScopes”を追加できます nonceやstateの値も同様です ボタンには “onCompletion”クロージャもあります リクエストの結果を取得し 成功や失敗のケースを処理する場所ですが― これは認可コントローラの デリゲートメソッドと同じです ボタンのスタイルを 選択することもできます Appleでサインインボタンに 使用できるスタイルは― ブラックか ホワイトか ホワイトアウトラインです ボタンのスタイルを パーソナライズしたい場合もあるでしょう 特定のWebサイトや アプリケーションの デザインに合わせたいようなら― それが可能な 新しいオンラインポータルをご紹介します サイトへのアクセスは appleid.apple.com/signinwithapple/button へ ここではボタンの機能も カスタマイズできます ラベルやサイズやポジションもです ボタンアセットをダウンロードし― プロジェクトやサイトにインポートもできます ではジョナサンに Appleでサインインへの アップグレードについて話してもらいます ありがとう アルフォンゾ 昨年 発表したAppleでサインインは 大反響を呼びました ワンタップでアプリケーションに サインインできる点がとても好評です しかし従来のユーザー名と パスワードベースのアカウントを使っていて― 現アカウントを フォークしたくないユーザーには? 今年は新しいAPIを導入し― Appleでサインインへの アップグレードを促します ユーザーのアカウントを Appleでサインインに更新させると― まず開発者とユーザーの両方にとって安全です Appleでサインインへの更新はアカウントを 2ファクタ認証にする最も簡単な方法です Appleでサインインは2つの要素を求め― ローカルの資格情報の状態に デバイストラストを利用します アカウントの回復も Appleでサインインで簡単になります ユーザーは よくパスワードを忘れ 照合が必要になりますが― あなたがユーザーの秘密を管理する必要はなく Appleでサインインを代わりに行います このAPIを利用すれば アカウントの重複も防げます この機能の利便性とセキュリティを ユーザーは気に入るはずです 従来のユーザー名とパスワードベースの アカウントを持つユーザーも― 現アカウントを 放棄する必要がなくなりました アップグレードすればいいからです “Appleでサインインにアップグレード”は 新しいAPIで― ユーザーにとっては高速で簡単な セキュリティアップグレードです あなたのアプリケーションを含む iOSとiPadOS全体の多くの場所で利用可能です ユーザーをアップグレードさせるために― AuthenticationServicesは 拡張ベースのAPIを利用しています この拡張機能を アカウント認証変更拡張と呼びます ユーザーにシームレスな体験を提供し― Appleでサインインへ サインイン方法をアップグレードできます ユーザーが Appleでサインインにアップグレードすると― フローが正常に完了した時 弱い資格情報がシステムから削除されます 独自のUIを追加するためのサポートもあり― Appleでサインイン資格情報を聞く前に セキュリティ検証を完了させたい場合に使えます 強力なパスワードへのアップグレードも 同時にサポートされます 今回はAppleでサインインへの アップグレードのフローを説明します 新しいAPIの実装や強力なパスワードへの アップグレードに関する詳細は― “One-Tap Account Security Upgrades”の セッションをご覧ください 実装後 ユーザーが拡張機能を 呼び出す方法は3つあります 1つは設定の新しいパスワードマネージャで セキュリティ勧告が弱い資格を特定した時です 2つ目はユーザーがアプリケーション操作で パスワードの自動入力を利用し― 弱い資格を選択した時です
最後はあなたがアプリケーション内で ユーザー操作を指定し AuthenticationServices APIを呼び出した時です 次は呼び出された拡張機能が どう機能するか見てみましょう アカウント変更拡張には いくつかの概念があります 名前で分かるでしょうが― ASAccountAuthenticationModification ViewControllerはビューコントローラです サブクラスは NSExtensionPrincipalClassです
拡張機能への最初の呼び出しが 非ユーザーインタラクティブ関数を呼び出し― 既存の資格でのAppleでサインインへの アップグレードを促す最初の試みとなります ここでアップグレードが行われれば― ユーザーにとって最小限の作業で済みます
ユーザーの検証に追加のUIが要る場合を考え ステップアップセキュリティビューを表示し― 同じ資格情報を個別に定義された関数を介し 拡張機能にパスすることもできます
最後の要素は拡張コンテキストプロパティです 拡張コンテキストは拡張と拡張の ホスティングプロセスの通信に使用されます ユーザー対話型および ステップアップセキュリティの機能内でです 拡張コンテキストにより― 拡張ホスティングプロセスに 起きたこと 起きるべきことを伝えられます
これはExtensionViewControllerサブクラスの スタブアウトバージョンで― 名前はAccountModificationViewController ご覧のとおり 3つの関数をオーバーライドしています convertAccountToSignInWithApple WithoutUserInteractionは― 拡張ホスティングプロセスによって 呼び出されました ユーザー操作なしで資格を アップグレードしようとしたのです 2つ目はviewDidLoad 必要に応じて中間UIの セットアップに使用できます 進行状況を示す中間UIの提供は― ネットワーク呼び出しや遅延が発生する場合 ユーザーエクスペリエンス向上に役立ちます 最後のprepareInterfaceToConvertAccount ToSignInWithAppleは― ビューが表示される直前に呼び出されます 非ユーザーインタラクティブフローで提供される 同じASPasswordCredentialを通過します この資格情報はフォームにユーザー名を 事前入力するなどのアクションに使われます または2ファクタ認証フローを開始します 時間がかかるタスクは非同期で実行し― 中間UIを利用して進行状況を示すべきです この呼び出しが終了するまで ステップアップビューは表示されません AccountAuthentication ModificationViewControllerの概要は以上です すべてが どのように連携するか― ASAccountAuthenticationModification ExtensionContextを見てみましょう 拡張コンテキストはアカウント変更 ビューコントローラの不可欠なプロパティです 前述のように拡張コンテキストは アップグレードのフローを制御します フローをどう制御するのでしょう? まずApple認証でサインインを要求する 機能があります リクエストの呼び出しに近く― アルフォンゾが述べたように Apple ID資格情報を使用します アプリケーション固有の サインインUIが表示されます
資格情報やサインイン中のアカウントを 審査し― アカウント検証のために 追加のUIが要ると判断した場合 拡張コンテキストはStepUpSecurityUIの 表示を要求するために使われます
ホスティングプロセスに フローの完了を指示するのにも使われ― これにより既存の資格情報が削除されます 最後に フローを完全に キャンセルする必要がある場合にも使われます
拡張コンテキストプロパティを さらに詳しく見てみましょう getSignInWithAppleAuthorization WithStateは― サインインUIとアプリケーションの情報を表示し ユーザーにアップグレードの承認を求めます 先ほどアルフォンゾが― ASAuthorizationAppleIDリクエストの stateとnonceを説明しました アップグレードフローではnonceとstateは この呼び出しへのパラメータとしてパスされます ユーザーがアップグレードを承認すると 完了ハンドラが呼び出され― フローの完了後 Apple ID資格情報を使用します 次はcompleteUpgradeToSignInWithApple これは拡張ホスティングプロセスに 認証が正常に完了したことを知らせ― パスワード資格情報を削除させます
最後はcancelRequest
APIは これがASExtensionErrorと共に 呼び出されることを想定しています 拡張機能が追加のUIを 表示する必要があると決めた場合― これをuserInteractionRequiredエラーで 呼び出すことが重要です ユーザーがUIフロー内でキャンセルした場合は userCanceledエラーを利用します 他のすべての失敗は failedエラーを使用できます 前のスライドではアカウント変更 ビューコントローラの概要を解説しました 次に拡張コンテキストプロパティが どうフローを制御するか見ました 今度はUIなしでアカウントを変換する 実装の詳細を見てみましょう OSでフローを始めます ユーザーが弱い資格情報で操作し― その資格情報をAppleでサインインに アップグレードしたい場合です アカウント変更拡張が パスワード管理プロセスにより初期化されました そしてConvertwithoutUI関数が呼び出され― Appleでサインインにアップグレードするため パスワード資格情報を提供します 拡張機能の仕事は資格情報を審査し― それが有効かどうかを アップグレードする前に確認することです ユーザー名がサインイン中のユーザーと 一致するか確認するのが― 最初の適切なアクションです
拡張機能がユーザーの 状態と資格情報から判断し― アカウント検証のために サーバを呼び出すとします サーバが資格情報を検証し認証は成功です 次にサーバは拡張機能に返信し― アカウントをAppleでサインインに アップグレードする準備ができたと確認します
アカウントが認証され アップグレードできると確認されたので― 拡張コンテキストは Apple ID資格情報の要求に使われます そのフローの解説の前に― アカウントに問題があり すぐに アップグレードできない場合を見てみましょう
先ほどと同様 フローの始まりは ユーザーが弱い資格情報を使い― Appleでサインインにアップグレードを 試みたところです アカウント変更拡張が パスワード管理プロセスにより初期化され― PreparetoConvertWithoutUI関数が パスワード資格情報と共に呼び出されます 情報が拡張機能によって検証されます 資格情報を検証する サンプルコードを見ましょう サンプルコードは列挙型を定義し 検証結果を表しています 検証結果を表す値は3つあります “success”“failure” “twoFactorAuthRequired”です
既存の資格情報が検証されると 3つの値のどれかが返されます
“failure”と出るのは サーバによる資格情報の検証で― アカウントかサーバの状態が アカウントの変換に適さないとされた場合です この場合 extensionContextを使い cancelRequestを呼び出し フローは終了します
“success”はアカウントがすぐに 変換できることを示します シーケンス図で示したとおりです extensionContextを使い Apple ID資格情報を取得します
“twoFactorAuthRequired”はユーザーに UIを見せる必要があることを意味します 資格情報だけではAppleでサインインに アップグレードできません これもextensionContextを 使って処理され― userInteractionRequiredエラーで cancelWithErrorを呼び出します 図に戻ります 拡張機能が verifyCredential関数を呼び出すと― 拡張機能のバックエンドが呼び出され 資格情報を検証します サーバはリクエストを受け アカウントの確認を試みます
このアカウントに 追加の検証が必要であると判断しました
その返事が拡張機能に戻り― verifyCredential関数が検証結果を “twoFactorAuthRequired”とします verifyCredential呼び出しの サンプルコードが示すように このケースは拡張コンテキストを 使って処理され― userInteractionRequiredエラーで cancelWithErrorを呼び出します ユーザーに余分な作業をさせぬよう UIのリクエストは必要最低限にしましょう 多くの場合 ユーザーは Appですでに認証されていて― 非ユーザーインタラクティブのフローで 変換を完了できます ただし この例に見られるように UIフローが保証される状況もあります どう機能するか見てみましょう userInteractionRequiredエラーで 拡張コンテキストがキャンセルされた後― パスワード管理プロセスがアカウント変更ビュー コントローラの新しいインスタンスを初期化 PreparetoConvertWithoutUI関数を呼び出し ASPasswordCredentialをパスします
拡張機能の ビューコントローラが表示され― スピニングギアなどの中間UIを提供します 前と同じ資格情報を利用し コンテキストを少し変更するだけで― バックエンドにリクエストが行われます サーバはアカウント検証を試み― 2ファクタ認証が必要だと 拡張機能に返事を送ります 拡張機能はビューを更新し 2ファクタ認証をユーザーに要求 ユーザーが検証コードを提供し 拡張機能が検証します ここでユーザーを検証できなければ― 失敗エラーでフローをキャンセルするために 拡張コンテキストが使用されます ユーザーが有効なコードを提供し 検証が成功すれば 拡張機能はApple ID資格情報を要求できます これでハッピーパスに戻りました アカウントが認証され アップグレードの対象となります アカウントは準備完了 Apple ID資格情報を要求し フローを終了しましょう アルフォンゾが言うように リクエストの安全性は重要です 拡張機能はstateとnonceを生成し― getAppleIDCredential呼び出しの パラメータとしてパスします Appleでサインインに アップグレードするUIがユーザーに表示され― ユーザーはFace IDを使って認証します getAppleIDCredential呼び出しの完了ブロックで Apple ID資格情報が拡張機能に提供され― 拡張機能は資格情報の状態プロパティを 先ほどの例と同様に検証します 拡張機能はアカウントのアップグレードを要求 必要なアカウント情報とApple ID資格情報を サーバのバックエンドに提供し― アカウントを変換できるようにします バックエンドは認証コードを Appleサーバと交換 identityTokenのnonceの値を検証し 成功の場合 アカウントの変換を実行し―
変換後 成功値を含む応答を返します サーバの操作が失敗した場合― 拡張コンテキストを使う必要があり 失敗エラーでcancelWithErrorを呼び出します 今回はサーバが成功を示しているので 拡張機能は必要な記録を行い― 拡張コンテキストでcompleteUpgrade ToSignInWithAppleを呼び出します パスワードマネージャが既存の資格情報を削除し フローは完成です 新しい拡張機能はユーザーの セキュリティを向上させるためにあります 弱い資格情報の代わりに Appleでサインインを提供するのです 古い資格情報は削除するため 次に サインインする時に混乱することはありません このAPIを利用すれば ユーザーに― 資格情報の最良のセキュリティプラクティスを アカウントの重複を避けつつ 実装させられます 便利なAPIでユーザーの既存アカウントを Appleでサインインに更新させましょう “Appleでサインインにアップグレード”を 実装してもらい 感想を頂くのが楽しみです 楽しんでいただけたでしょうか 引き続きWWDCをお楽しみください
-
-
2:02 - Create an Authorization Request
// Configure request, setup delegates and perform authorization request @objc func handleAuthorizationButtonPress() { let request = ASAuthorizationAppleIDProvider().createRequest() request.requestedScopes = [.fullName, .email] request.nonce = myNonceString() request.state = myStateString() let controller = ASAuthorizationController(authorizationRequests: [request]) controller.delegate = self controller.presentationContextProvider = self controller.performRequests() }
-
5:37 - Get a credential from an Authorization
// ASAuthorizationControllerDelegate func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { if let credential = authorization.credential as? ASAuthorizationAppleIDCredential { let userIdentifier = credential.user let fullName = credential.fullName let email = credential.email let realUserStatus = credential.realUserStatus let state = credential.state let identityToken = credential.identityToken let authorizationCode = credential.authorizationCode // Securely store the userIdentifier locally self.saveUserIdentifier(userIdentifier) // Create a session with your server and verify the information self.createSession(identityToken: identityToken, authorizationCode: authorizationCode) } }
-
8:51 - Verify the state of a credential
// Getting a credential state let provider = ASAuthorizationAppleIDProvider() provider.getCredentialState(forUserID: getStoredUserIdentifier()) { (credentialState, error) in switch(credentialState) { case .authorized: // Sign in with Apple credential Valid case .revoked: // Sign in with Apple credential Revoked, Sign out case .notFound: // Credential was not found, fallback to login screen case .transferred: // Application was recently transferred, refresh User Identifier @unknown default: break } }
-
11:00 - Migrate a user identifier
// Migrating a user identifier let request = ASAuthorizationAppleIDProvider().createRequest() request.requestedScopes = [.fullName, .email] request.user = getStoredUserIdentifier() request.nonce = myNonceString() request.state = myStateString() let controller = ASAuthorizationController(authorizationRequests: [request]) controller.delegate = self controller.presentationContextProvider = self controller.performRequests()
-
13:54 - Create a Sign in with Apple button
// SwiftUI example: SignInWithAppleButton(.signIn) { onRequest: { (request) in request.requestedScopes = [.fullName, .email] request.nonce = myNonceString() request.state = myStateString() } onCompletion: { (result) in switch result { case .success(let authorization): // Handle Authorization case .failure(let error) // Handle Failure } } }.signInWithAppleButtonStyle(.black)
-
25:15 - convertAccountToSignInWithAppleWithoutUserInteraction
enum VerificationResult : Int { case success; case failure; case twoFactorAuthRequired; override func convertAccountToSignInWithAppleWithoutUserInteraction( for serviceIdentifier: ASCredentialServiceIdentifier, existingCredential: ASPasswordCredential ) { verifyCredential(existingCredential) { (result: VerificationResult) in switch result { case .failure: self.extensionContext.cancelRequest(withError: ASExtensionError(.failed)) case .success: self.extensionContext.getSignInWithAppleAuthorizationWithState(state: myStateString(), nonce: myNonceString(), {…} case .twoFactorAuthRequired: self.extensionContext.cancelRequest(withError: ASExtensionError(.userInteractionRequired)) } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。