がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

アプリでの、会員登録&認証

ちと急ぎで必要だったので、ざっくりと。
近々、もうちょっと落ち着いて書く予定ではございますが、ツッコミなどありましたら頂戴できれば幸いです。

前提

フロントってのは、ようはUnityやらcocosやらMonacaやらその他で作られた「アプリ」です。
基本的に「通信があるゲームを作る」ケースにおける、鯖側の実装を書くのが「ゲームプログラミング鯖」のタグなので、まぁそんな感じです。

必要なもの結論

  • request:アカウント登録
    • uuid:ユーザのuuid(アプリ内で生成)
    • name:ユーザが入力した名前
  • response
    • booleanで成功または失敗
  • request:uuidの取得
    • リクエストパラメタ無し
  • response
    • uuid
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `user_id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ユーザID',
  `uuid` varbinary(48) NOT NULL COMMENT '機種側で持っているUUID',
  `name` varbinary(256) NOT NULL COMMENT '名前。表示用',
  INDEX uuid_idx_1 (`uuid`)
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8  COMMENT='1レコードが1ユーザを意味するテーブル';

順を追って説明

ユーザを識別するために必要なID(UUIDv4が適切でしょう)を保存する領域を作っておきます。
localなストレージならどこでもよいですが、cocos2d-x的にいうのであれば、プリファレンスとか、お気軽お手軽でよろしいんじゃないでしょうか?


起動画面はまぁ「絵を表示するだけ」だと思うので。
ここに「ゲームスタート」とかいうボタンがあると仮定します。


この「ゲームスタート」のボタンをclickして遷移した先で、以下の判定を、フロントで行います。
・もしプリファレンスに「UUID」が保存されていなければ、登録画面に遷移する


登録画面では、まぁ「いらない」可能性もありますのでそのときはオミットしていただくとして、とりあえず「ユーザさんの表示名」くらい受け取っておきましょう。
で、登録ボタンを押したら、サーバに以下の通信を発生させます。

  • request:アカウント登録
    • uuid:ユーザのuuid(アプリ内で生成)
    • name:ユーザが入力した名前
  • response
    • booleanで成功または失敗


ちなみに「アプリ内でuuidどうやって作ろう?」って悩んだら、鯖側で実装してもよいです。

  • request:uuidの取得
    • リクエストパラメタ無し
  • response
    • uuid


実装は、それこそ

<?php
echo `uuidgen -r`;

とかでよろし。


また「アカウント登録」の登録によって、鯖側では以下のDBに登録をしておくとよいでしょう。

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `user_id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ユーザID',
  `uuid` varbinary(48) NOT NULL COMMENT '機種側で持っているUUID',
  `name` varbinary(256) NOT NULL COMMENT '名前。表示用',
  INDEX uuid_idx_1 (`uuid`)
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8  COMMENT='1レコードが1ユーザを意味するテーブル';


以上が出来てしまえば。
後は、あらゆる通信で、パラメタ(またはHTTP header)にUUIDをいれる事で、簡単にユーザの特定ができます。
処理としては「存在するuuidなら、該当ユーザからのアクセスだろう」という程度の簡単な処理です。
とりあえず通信経路は「httpsである」前提ですが(盗聴防止)、これで「利便性とセキュリティのバランス」もある程度取れるかと思います。


クラックの考察はまた後日、余裕のある時に。
一回「uuidからセッションID的なものを寿命付きで作成して…」ってのを思考実験してみたのですが、手間ほどに旨みが多くなかったので。
「特に止めはしない」のですが「お勧めもしない」なぁ、という程度でした。


あと、以前「パラメタ(+特定の秘密情報)のハッシュ値を付ける」的なのが必要なのではないか? という話が出たことがあるのですが。
これも考察は後日付けますが。銀行などの「課金系」だと意味があるのですが、ゲーム系のクラックでは意味がないです。


「機種を変えた時」の方法は、些か方法が種類あるのですが、まぁ基本は似たようなものではあるので。
そちらについても、実装は後日、付記してみたいかなぁ、と思います。


…近々、もうちょっと落ち着いて書けるとよいのですが。
取り急ぎ、認証系だけざっくり。