1. はじめに
GoogleログインのようなOAuth2.0サービスを利用すると、ログインやユーザー登録が簡単になります。その一方で、外部サービスに依存してしまうために、統合テストやE2Eテストの自動化が難しくなってしまいます。
そこで、モックサーバーを作って、テストを簡略化することを試みました。今回は作成したモックサーバーの紹介をしたいと思います。
モックサーバーのコード
ここに置いてあります。
言語: Rust
フレームワーク: Axum
Googleログインはモックできました。その他のサービスは検証していません。
2. OAuth2.0の仕組み
はじめに、OAuth2.0の仕組みについてまとめます。OAuth2.0とは、あるサービスが保有するユーザー情報を外部サービスに提供するための方法です。以下では、ユーザー情報を保有するサービスを「リソースサービス」、外部サービスを「クライアントサービス」と呼ぶことにします。リソースサービスから提供されたユーザー情報を使って、クライアントサービスはログインなどの処理を行います。
全体の流れを図示すると、以下の図のようになります。
登場人物の具体例を挙げると、
- ユーザー=あなた
- リソースサービス = Google
- クライアントサービス = Qiita
となります。
次に、図の各ステップで何をしているかを説明します。
① ユーザーはOAuth2.0を使ったログインをしたいと、クライアントサービスに要求します
② クライアントサービスは、ユーザーに情報の提供を承認してもらう必要があります。そこで、リソースサービスの承認用URLを送ってリダイレクトしてもらいます。この時、後々クライアントサービスに戻ってくるために、コールバックURLも用意しておきます。
③ ユーザーはリソースサービスにログインして、承認をします。
④ リソースサービスは承認を受け付けると、認可コードをユーザーに送り返します。
⑤ さらに、ユーザーは認可コードをクライアントサービスに送ります。
⑥ クライアントサービスは、認可コードとあらかじめ保有していた認証情報をリソースサービスに送って、ユーザー情報取得APIを利用するためのアクセストークンを要求します。
⑦ リソースサービスはアクセストークンを返却します。
⑧ クライアントサービスはアクセストークンを使ってユーザー情報取得APIを叩きます。
⑨ リソースサービスはユーザー情報を返却します。
3. モックサーバーの概要
以下の図のようなログインページを用意して、入力された名前とメールアドレスをユーザー情報としてそのまま返すモックサーバーを作成しました。
作成したエンドポイントは次の4つです。
-
GET
/login
ログインページを返します。クエリパラメータとしてリダイレクトURLも受け取って、セッションに保存しておきます。(③ ・④ に対応) -
POST
/login
ログインボタンを押すと、このエンドポイントにリクエストを飛ばします。リクエストを受け取ると、ランダムな認可コードを発行し、認可コードをKEYとしてユーザー名とメールをハッシュに挿入します。(③ ・④ に対応) -
POST
/token
認可コードを受け取って、アクセストークンを返します。このモックでは、認可コードをアクセストークンとしてそのまま返します。(⑥・⑦ に対応) -
GET
/info
アクセストークンを受け取って、ハッシュから対応するユーザー名とメールを検索して返します。(⑧・⑨ に対応)
4. 最後に
自動テストツールでGoogleログインを実行しようとすると、ブロックされてしまいます。この問題に対処するために、今回のモックサーバーを作成しました。同じような問題に苦しんでいる人の参考になれば幸いです。