0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Unity] OneTapログインの実装

Posted at

概要

https://developers.google.com/identity/one-tap/android/overview?hl=ja
未来の自分のために備忘録として残す

経緯

Nonceを扱える既存ライブラリを見つけられなかった

実装

Unityのバージョンは[2021.3.23f1]

1. ExternalDependencyManagerの導入

パッケージのリンクがあるので踏んで落とす
https://github.com/googlesamples/unity-jar-resolver/releases/tag/v1.2.176
※Firebase等を導入していれば必要ないかも

2. Javaファイルの作成

いつからかjavaファイルを入れるだけで勝手にビルドしてくれるようになったので活用する
パスは[Assets/Plugins/Android/MyClass.java]
※ファイル名とクラス名は必ず一致させる

MyClass.java

ここのサンプルまんまでいける
https://developers.google.com/identity/one-tap/android/get-saved-credentials?hl=ja

package MyPackage;

import android.content.Intent;
import android.content.IntentSender;
import android.os.Bundle;
import com.google.android.gms.auth.api.identity.BeginSignInRequest;
import com.google.android.gms.auth.api.identity.GetSignInIntentRequest;
import com.google.android.gms.auth.api.identity.Identity;
import com.google.android.gms.auth.api.identity.SignInClient;
import com.google.android.gms.auth.api.identity.SignInCredential;
import com.google.android.gms.common.api.ApiException;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;

public class MyClass extends UnityPlayerActivity {
    final int SignInCode = 999;
    SignInClient client;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        client = Identity.getSignInClient(this);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == SignInCode) {
            try {
                SignInCredential credential = client.getSignInCredentialFromIntent(data);
                var jwt = credential.getGoogleIdToken();
                UnityPlayer.UnitySendMessage("", "", jwt);
            }
            catch (ApiException e) {
                UnityPlayer.UnitySendMessage("", "", e.toString());
            }
        }
    }

    public void SignInGoogle(String clientId, String nonce) {
        // GetSignInIntentRequest request = GetSignInIntentRequest.builder()
        //     .setServerClientId(clientId)
        //     .setNonce(nonce)
        //     .build();
        BeginSignInRequest request = BeginSignInRequest.builder()
            .setPasswordRequestOptions(BeginSignInRequest.PasswordRequestOptions
                .builder()
                .setSupported(true)
                .build()
            )
            .setGoogleIdTokenRequestOptions(BeginSignInRequest.GoogleIdTokenRequestOptions
                .builder()
                .setSupported(true)
                .setServerClientId(clientId)
                .setNonce(nonce)
                .build()
            )
            .setAutoSelectEnabled(true)
            .build();

        // client.getSignInIntent(request)
        client.beginSignIn(request)
            .addOnSuccessListener(result -> {
                try {
                    startIntentSenderForResult(
                        // result.getIntentSender(),
                        result.getPendingIntent().getIntentSender(),
                        SignInCode,
                        null, 0, 0, 0, null
                    );
                }
                catch (IntentSender.SendIntentException e) {
                    UnityPlayer.UnitySendMessage("", "", e.toString());
                }
            })
            .addOnCanceledListener(() -> {
                UnityPlayer.UnitySendMessage("", "", "canceled");
            })
            .addOnFailureListener(e -> {
                UnityPlayer.UnitySendMessage("", "", e.toString());
            });
    }

    public void SignOutGoogle() {
        client.signOut();
    }
}

コメントアウト部分を置き換えると古いUIにできる
細かいところは各プロジェクト毎に変えれば良い

3. 依存パッケージの追加

javaで書いたidentityのAPIを使えるようにする
任意のEditorフォルダ(?)にxmlファイルを追加

MyClassDependencies.xml
<?xml version="1.0" encoding="UTF-8" ?>
<dependencies>
  <androidPackages>
    <androidPackage spec="com.google.android.gms:play-services-auth:20.5.0">
    </androidPackage>
  </androidPackages>
</dependencies>

4. AndroidManifestの作成

Project Settings > Player > Publish Settings
Custom Main Manifest ☑

Assets/Plugins/Android/AndroidManifest.xml
に作成される

7行目のactivityのnameをさっき作ったjavaファイルに合わせる
MyPackage.MyClass(パッケージ+クラス名)

5. ビルドして確認

細かい注意点等

・Firebaseの設定と並行でやってたので抜け漏れはあるかも

・javaに渡すClientIdは 'client_type=3(ウェブアプリケーション)'
Firebaseプロジェクトからgoogle-services.json落とすと分かりやすい

・c#側でコールする場合

×
ajo = new AndroidJavaObject("MyPackage.MyClass");
○
ajo = new AndroidJavaClass("com.unity3d.player.UnityPlayer")
    .GetStatic<AndroidJavaObject>("currentActivity");

・UnityPlayerActivity継承するしかないんかな

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?