FC2ブログ
 
■プロフィール

クリエイトウェーブスタッフ

Author:クリエイトウェーブスタッフ
開発における、諸々を書いていきたいなと思っています。

■最近の記事
■カテゴリー
■最近のコメント
■月別アーカイブ
■最近のトラックバック
■ブログ内検索

■RSSフィード
■リンク
FireBaseのUserIDじゃなく、UserTokenを使う
あけましておめでとうございます。
今年も、UnityとFireBaseガンガンやっていきます。

さて、早速ですが、UnityとFioreBaseのCloudFunctionでやりとりするときに、FioreBaseのUserIDを使うのがシンプルですが、UserTokenを使う手もあります。
トークンは、CloudFunction上でUserIDに変換され、トークンは一定時間で変化するのでセキュリティ的にもUserIDで直接やりとりするよりも強力です。

まずは、Unity側
-----------------------------------------------------------
Firebase.Auth.FirebaseUser user = auth.CurrentUser;
user.TokenAsync(true).ContinueWith(task => {
 if (task.IsCanceled) {
   Debug.LogError("TokenAsync was canceled.");
   return;
 }

 if (task.IsFaulted) {
   Debug.LogError("TokenAsync encountered an error: " + task.Exception);
   return;
 }
 string token = task.Result;//ここでトークンを取得
});
-----------------------------------------------------------
こんな感じです。

次に、受け取ったトークンをUserIDに変換するCloudFunction側
-----------------------------------------------------------
admin.auth().verifyIdToken(token)
 .then(function (decodedToken) {
   fireBaseId = decodedToken.uid;//変換されたUserID
   return
 }).catch(function (error) {
   //エラー処理
});
-----------------------------------------------------------
こんな感じです。


カテゴリー:Unity&FireBase | TM(0) | CM(0)
スマートフォンのFireBase匿名ログインで毎回IDを変える方法
そんな使い方する人はいないと思いますが、FireBaseの匿名認証で毎回IDを変える方法です。

ご存知の方も多いと思いますが、FireBaseの匿名認証は、スマートフォンでログインする場合、毎回同じIDになります。
例え匿名認証してるアプリをアンインストールして、インストールし直したとしても同じIDになります。

対して、開発中のPCのUnityEditorだと毎回変わってしまうので、厄介だったりするのですが、前に作ったスマートフォン用カジュアルゲームにランキングをつけているんですが、どう考えても毎回ログインIDが変わってるという事象に遭遇しました。

プレイ本人の最高点を更新する形にしていたはずなのですが(つまり、1ユーザー1つのデータしかもたない)、なぜか毎回登録されて前にプレイした自分の点数が別人扱いになっている。。。 なぜじゃ・・FireBaseの仕様が変わったのかなと思ってたら違いました。

FirebaseAuth.DefaultInstance.SignOut();

この1行を実行してるせいだった・・・
FireBaseのRealTimeDBは、Unityとソケット接続で常時接続なんていう事をやれる仕組みなので、ランキング登録したあとは、
SignOut();
したほうがいいのかな。。。と、よく調べもせず書いてしまったのがうかつでした。

サインアウトは、FireBaseの接続をサインアウトするのではなく、ログイン関係含むFireBaseのシステムからサインアウトする(リセットする)って意味だったようです。

FirebaseAuth.DefaultInstance.SignOut();
を実行すると、前の情報はなくなってるので、新しい匿名IDが生成されます。
これで毎回匿名IDを変える事が可能。。。って使いみちあるのかな。

匿名IDは上記のようにサインアウトしない限り、アプリをアンインストールして再インストールしても変化しない為、匿名ID使ったガチャゲーだと、リセマラできないシステムになりますね・・・ と言っていたのですが、IDリセットボタンをつければ、ユーザーが毎回ダウンロード&インストールしなくてもリセマラ出来るシステムが出来上がりますね・・・・ わざわざそんな使い方する必要はないですが・・

カテゴリー:Unity&FireBase | TM(0) | CM(0)
Cloud functions上とUnityのAPI通信で余分な文字列削除
昨日の暗号の実験も兼ねて、FireBaseのCloud functions(言語はNode.js)にUnityからPOST通信でJson文字列を送ってみました。
文字列はちゃんときてて見かけ上は

var jsonStr = {"id":"UnityEditor"}; 
var json = JSON.parse(jsonStr);
※ {"id":"UnityEditor"};がUnityから送った文字列です。

しかし・・・ しかしですよエラーです。
おかしい・・・・ 意味わからない。

Cloud functionsのエラーログを見ると{"id":"UnityEditor"} の20文字目が原因とある。
調べてみると最後の }  の文字が0からスタートして19文字目で20文字目なんてない・・・ハズ。
Unityで暗号かけて、Node.js で複合してるせいなのか・・・・ それともそんな事しなくてもこうなるの?

とにかく、これはログとかに出ない最後になんか変な文字が入ってるなと思って
(これが結構プログラムしてると出くわす問題だったりします)

jsonStr = jsonStr.trim();

をかけてみました。効果なし・・・・・
う~む

とりあえず、jsonStrの文字数をログに出してみる・・
32文字・・・  えっ32文字だって・・・・ 全部で20文字なのに12文字多いのはどういうこっちゃ!! と思って
for(var i = 0 ; i < jsonStr .length ; i++)
{
   console.log(jsonStr.charCodeAt(i));
}

で一文字ずつ文字コードをコンソールに書き出してみました。 
20から32まで文字コード0が続いている・・・ 文字コード0!? そんな文字あるの?

しょうがないので色々しらべて
jsonStr = jsonStr.replace(new RegExp("^" + String.fromCharCode(0) + "+|" + String.fromCharCode(0) + "+$", "g"),'');

と、文字列の前後から余分な文字コード0の文字を削除する命令をつけてみました。
そしたら、うまくいった。
問題なく文字列をJson化してくれました。

毎回一発でうまくいかなくて、がっくりきますが、今回もそのパターン・。
とりあえず、うまくいってよかった。

カテゴリー:Unity&FireBase | TM(0) | CM(0)
Node.jsとUnityで暗号通信
使うかどうか判りませんが、FireBaseのCloud functions(言語はNode.js)とUnity(C#)でAESの暗号のやりとりを出来るようにしておこうとやってみました。
Unityのコードは

実際サーバーをPHPでやっていた時は、うまく動いてました。

で、Node.jsの方も色々調べて

というのを書いてみました。

Node.js上で作った暗号は、Node.jsで複合成功。
Node.jsで作った暗号は、Unityで複合成功
しかし。。。。 Unityで作った暗号はNode.jsで複合に成功しない・・・・エラーです。

う~む、これで終わりと思ったのですが、やはりうまくいかないものです。
格闘して調べて正解は

decipher.setAutoPadding(auto_padding =false); //パディングの設定をしなければならない
が必要のようです。
Unity側でパディング設定があるから、Node.js側もいるのでは? と思ったらズバリでした。(パディングの意味とか判ってないんですが><)

ホントは、module.exports でクラス化したかったんですが、exportsするとなぜかこの
decipher.setAutoPadding(auto_padding =false); を受け付けてくれない・・・ なぜなんでしょう。

結局1日以上潰してしまいました。

カテゴリー:Unity&FireBase | TM(0) | CM(0)

FC2Ad