技術と趣味の亜空間

主にゲームプログラミングとその周辺に関する記事を不定期で上げていきます

【Unity】Sign in with Appleをクライアントで実装する

Sign in with Apple by Unity

概要

ソシャゲのSNS連携でお馴染みのApple IDでログインできる機能「Sign in with Apple」を外部プラグインを利用してUnityで実装します。
今回はテストなのでサーバーは利用せず、クライアントでログインができるところまでとします。

◆執筆時のUnity version
2019.18f1

プラグインの検討

UnityでSign in with Appleを実現するためのプラグイン公式から出ているのですが、
いかんせんNonceを扱っておらず、セキュリティ面で問題があるため色々足りない部分を自作する必要があります。
なので実装が大変な点から今回はサードパーティの「Sign in with Apple Unity Plugin」を利用します。

github.com

こちらはNonceはもちろんのこと、クイックログインにも対応してあります。
また、ドキュメントも非常に丁寧である点やIssueでのサポートも2021年3月現在もしっかり行っている点が公式のよりも安心・安全です。
ただし、注意点としてSign in with Appleのネイティブ機能はiOS13以上を対象としています。
iOS13未満およびAndroidではこの機能は利用できないため、代わりに認証サイト経由でログインしてもらうことになります。
そちらに関する記事は後日別の記事で紹介しようと思います。

実装

Sign in with Apple Unity Plugin」はUnityパッケージでの導入の他にPackage ManagerOpenUPMにも対応しているのでお好みの方法で導入します。
Installationの項目を見ながら進めれば特に問題なくインストールできると思います。

初期化処理

最初にログイン処理諸々をやってくれる AppleAuthManager クラスのインスタンスを生成します。
生成時に PayloadDeserializer クラスのインスタンスを渡す必要があるので作成してコンストラクタに渡しておきます。
そしてAppleログインが成功したかチェックするために Update() メソッドで AppleAuthManager.Update() を呼び出します。

ログイン

次にログイン処理を実装します。
まず AppleAuthLoginArgs クラスのインスタンスを生成し、
次に LoginWithAppleId を呼び出して先程生成した AppleAuthLoginArgsインスタンスを引数に渡すだけです。

この AppleAuthLoginArgs クラスはコンストラクタでログイン成功時に受け取れるデータとNonceを指定できます。
指定できる受取データはEメールやユーザーのフルネームです。
これでボタンを押せば、iOS13以上だとログイン画面が表示されるようになります。
受け取ったログインデータは LoginWithAppleId の引数で渡したコールバックに返ってきます。

注意点として、Eメールやユーザーのフルネームは初回ログイン時だけしか受け取れません。
もしSNS連携で利用する場合、連携登録と解除を何度も行える仕様ならば2回目以降にユーザーがログインした場合、これらの値が含まれていない Identity Token が発行されるため、 代わりに Identity Token に常に含まれる sub などの値を用いてユーザーの照合を行うようにしましょう。

Firebase Authentication 利用時

もしプロジェクトでFirebase Authenticationを利用している場合は以下の対応が別途必要です。

  • Nonce をサーバー or クライアントで生成する
  • AppleAuthManager.LoginWithAppleId() に生成したNonceを渡す
  • 成功時のコールバック内で PerformFirebaseAuthentication() に認証データを渡す

詳細な解説はプラグインwikiにコード付きで丁寧に記載されていますのでそちらを御覧ください。
Sign in with Apple Unity Plugin: Working with Firebase · lupidan/apple-signin-unity Wiki · GitHub

ビルド設定

最後に、Xcodeにビルドするときの自動化設定を行います。
特に難しいところはなく、プラグイン側で ProjectCapabilityManager の拡張メソッド AddSignInWithAppleWithCompatibility が用意されいるのでそれを呼び出すだけです。
注意点として、Sign in with Apple は Enterprise のアカウントだと利用できません。(正確にはSign in with Appleの設定が存在しません)
Apple Payと同じく通常のApple Developer Programで設定を変更する必要があります。
Developer Program専用の都合上、AddSignInWithAppleWithCompatibility はEnterprise版のバンドルIDでビルドするとエラーになってしまうため、AuthenticationServices.framework だけオプショナルで追加しておくとエラーを回避できます。
以下が自動化ファイルです。これをEditorフォルダ以下に設定すれば完了です。

もしコンパイルエラーになった場合はAssembly DefinitionをEditorフォルダ直下に作成してPlatformをEditorだけにチェックし、 Assembly Definition References に AppleAuth.Editor.asmdef を指定してあげれば直ると思います。

Apple Developer Program で設定

Sign in with Appleを利用する際にはApple のデベロッパーポータル有効にする必要があります

  1. Certificates, IDs & Profiles -> Identifiers -> [特定のApple ID]
  2. 設定項目の下の方にある「Sign in with Apple」の左のチェックボックにチェックを入れる
  3. 横のEditボタンを押す ->「Enable as a primary App ID」にチェックを入れて「Save」ボタン
  4. 「Edit your App ID Configuration」の右側にある「Save」ボタンを押して設定を保存

実機検証

ボタンタップ時に以下のようなウィンドウが表示されれば実装は成功です。
なお、ログインするためには二段階認証が設定されたApple IDが必要になります。 Sign in with Apple by Unity