ログイン処理のプロトタイプ① =モノリシックに=

なぜこの記事を書いたの?

多人数がアクセスする放置ゲームを作ろうと思っていて、手始めにタイトル画面を作ろうと考えました。

しかし、ログインページを作ったことがないのでログインの仕組みがあまりしっくりと理解しておらず…

じゃあ、手始めに試作品レベルで作ってみようということにしました。

将来的にはこんな感じで作ってみたい

  • 複数のクライアントがアクセスできる
  • クライアントとDBは疎結合にするため、Queueを使う
  • login情報を渡したクライアントにresultを返すことができる
  • 数千規模の同時ログインでも負荷に耐えられるようにしたい
  • ログインのサービスは柔軟に変更できるようにしたい
    (ローカル vs AWS vs PlayFab vs Etc...)

現状

  • とりあえずPythonでクライアントもサーバーも一つのコードで実装
  • idとpassword形式
  • 内部で保管しているidとパスが一致したか否かでbool値を返す

コード

# データベース
class DB:
    def __init__(self) -> None:
        self._db = {
            "sandbox1": "password1",
            "sandbox2": "password2",
            "sandbox3": "password3",
        }

    def login(self, id: str, password: str):
        return password == self._db.get(id)


# 入力テスト
db = DB()

kv = [
    ("sandbox1", "password1"),
    ("sandbox2", "password2"),
    ("sandbox3", "password3"),
    ("bad_id", "password"),
    ("sandbox", "bad_pass"),
    (123, "password"),
    ("sandbox", 123),
]

for arg in kv:
    print("{}:{}:{}".format(arg[0], arg[1], db.login(arg[0], arg[1])))

=Output=

$ python sandbox_login.py 
sandbox1:password1:True
sandbox2:password2:True
sandbox3:password3:True
bad_id:password:False
sandbox:bad_pass:False
123:password:False
sandbox:123:False

知見

有用性はともかく、モノリシックに作るのなら比較的に簡単に作れました。

原始的なログイン処理はこんな形ではないかと予想しています。

今後の見通し

拡張する場合は、まず必要になるのがDBの分離でしょうか…

今の所、ローカルにRedisのコンテナを立ててやりとりできないか考え中です

また、ソシャゲでは必須になるであろう匿名ログインの実装方法についても考えていきたいなと思います。


今回はここまで、それではまた。