LoginSignup
5
0

1. はじめに

GoogleログインのようなOAuth2.0サービスを利用すると、ログインやユーザー登録が簡単になります。その一方で、外部サービスに依存してしまうために、統合テストやE2Eテストの自動化が難しくなってしまいます。

そこで、モックサーバーを作って、テストを簡略化することを試みました。今回は作成したモックサーバーの紹介をしたいと思います。

モックサーバーのコード

ここに置いてあります。
言語: Rust
フレームワーク: Axum

Googleログインはモックできました。その他のサービスは検証していません。

2. OAuth2.0の仕組み

はじめに、OAuth2.0の仕組みについてまとめます。OAuth2.0とは、あるサービスが保有するユーザー情報を外部サービスに提供するための方法です。以下では、ユーザー情報を保有するサービスを「リソースサービス」、外部サービスを「クライアントサービス」と呼ぶことにします。リソースサービスから提供されたユーザー情報を使って、クライアントサービスはログインなどの処理を行います。

全体の流れを図示すると、以下の図のようになります。

スクリーンショット 2023-12-18 230836.png

登場人物の具体例を挙げると、

  • ユーザー=あなた
  • リソースサービス = Google
  • クライアントサービス = Qiita

となります。


次に、図の各ステップで何をしているかを説明します。

① ユーザーはOAuth2.0を使ったログインをしたいと、クライアントサービスに要求します

② クライアントサービスは、ユーザーに情報の提供を承認してもらう必要があります。そこで、リソースサービスの承認用URLを送ってリダイレクトしてもらいます。この時、後々クライアントサービスに戻ってくるために、コールバックURLも用意しておきます。

③ ユーザーはリソースサービスにログインして、承認をします。

④ リソースサービスは承認を受け付けると、認可コードをユーザーに送り返します。

⑤ さらに、ユーザーは認可コードをクライアントサービスに送ります。

⑥ クライアントサービスは、認可コードとあらかじめ保有していた認証情報をリソースサービスに送って、ユーザー情報取得APIを利用するためのアクセストークンを要求します。

⑦ リソースサービスはアクセストークンを返却します。

⑧ クライアントサービスはアクセストークンを使ってユーザー情報取得APIを叩きます。

⑨ リソースサービスはユーザー情報を返却します。

3. モックサーバーの概要

以下の図のようなログインページを用意して、入力された名前とメールアドレスをユーザー情報としてそのまま返すモックサーバーを作成しました。
login-page.png

作成したエンドポイントは次の4つです。

  • GET /login
    ログインページを返します。クエリパラメータとしてリダイレクトURLも受け取って、セッションに保存しておきます。(③ ・④ に対応)
  • POST /login
    ログインボタンを押すと、このエンドポイントにリクエストを飛ばします。リクエストを受け取ると、ランダムな認可コードを発行し、認可コードをKEYとしてユーザー名とメールをハッシュに挿入します。(③ ・④ に対応)
  • POST /token
    認可コードを受け取って、アクセストークンを返します。このモックでは、認可コードをアクセストークンとしてそのまま返します。(⑥・⑦ に対応)
  • GET /info
    アクセストークンを受け取って、ハッシュから対応するユーザー名とメールを検索して返します。(⑧・⑨ に対応)

4. 最後に

自動テストツールでGoogleログインを実行しようとすると、ブロックされてしまいます。この問題に対処するために、今回のモックサーバーを作成しました。同じような問題に苦しんでいる人の参考になれば幸いです。

5
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
5
0