MRが楽しい

MRやVRについて学習したことを書き残す

MetaQuest3でOpenIDConnectの認可コードフローを試す

本日はMetaQuest3の小ネタ枠です。
MetaQuest3でOpenIDConnectの認可コードフローを行う方法を記事にします。

前提条件

本記事のサンプルでの認証先として以下の記事で作成した環境を利用します。
事前に利用するアプリのアプリケーションIDとディレクトリIDをメモしておきます。
bluebirdofoz.hatenablog.com

また認証結果をURIスキームを使って受け取るため、リダイレクトURIを以下の手順で追加しました。

リダイレクトURIの追加

グローバル管理者の権限を持ったアカウントでAzurePortalにサインインし、[アプリの登録]を選択します。
portal.azure.com

[ディレクトリ内のすべてのアプリケーションを表示]をクリックして、今回利用するアプリ設定を選択します。

アプリの登録画面が開くので[認証]タブを開き、リダイレクトURI欄の[URIの追加]を選択します。

入力欄に利用したいリダイレクトURIを入力して[保存]を実行します。
今回は以下のリダイレクトURIを追加しました。

holomontestapp://redirect/


アプリにスキームURIの設定を行う

リダイレクトURIをアプリで受け取るため、Quest3アプリにスキームURIの設定を行います。
プロジェクトのアセットフォルダにあるAndroidManifest.xmlを開きます。

Assets/Plugins/Android/AndroidManifest.xml

AndroidManifest.xmlに以下のようにインテントフィルターを追加しました。
今回の設定では holomontestapp のURIでアプリが起動するようになります。

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:installLocation="auto">
  <application android:label="@string/app_name" android:icon="@mipmap/app_icon" android:allowBackup="false">
    <activity android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" android:configChanges="locale|fontScale|keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|touchscreen|uiMode" android:launchMode="singleTask" android:name="com.unity3d.player.UnityPlayerActivity" android:excludeFromRecents="true" android:exported="true">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="com.oculus.intent.category.VR" />
      </intent-filter>

      <!-- カスタムURLスキーム設定 -->
      <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <!-- BROWSABLEを指定するとブラウザから起動できる -->
        <category android:name="android.intent.category.BROWSABLE"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="holomontestapp"/>
      </intent-filter>
      
      <meta-data android:name="com.oculus.vr.focusaware" android:value="true" />
    </activity>
    <meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="false" />
    <meta-data android:name="com.samsung.android.vr.application.mode" android:value="vr_only" />
    <meta-data android:name="com.oculus.ossplash.background" android:value="black" />
    <meta-data android:name="com.oculus.supportedDevices" android:value="quest|quest2|questpro" />
  </application>
  <uses-feature android:name="android.hardware.vr.headtracking" android:version="1" android:required="true" />
</manifest>

developer.android.com

次にボタン押下で認可エンドポイントにアクセスして認証を開始する以下のスクリプトを作成しました。
指定のリダイレクトURIを受け取り、認証に成功していればIDトークンを取得して結果を表示します。
・OpenIDConnectTest.cs

サンプルシーンにスクリプトを配置し、ButtonとTextコンポーネントの参照を設定しました。
ClientIDとTenantIDのフィールドにそれぞれ前述でメモしたアプリケーションIDとディレクトリIDを入力しておきます。

ビルドと動作確認

以下の記事を参考にプロジェクトのビルドとQuest3へのデプロイを実行してください。
bluebirdofoz.hatenablog.com

MetaQuest3でデプロイしたアプリを起動し、ボタンを押下します。

認証画面がブラウザで開くのでユーザIDとパスワードを入力してアプリへのサインインを許可します。

認証が成功するとテキスト欄に取得したIDトークンが表示されます。