kenkoooo / AtCoderProblems

Extend your AtCoder
https://kenkoooo.com/atcoder/
MIT License
1.41k stars 150 forks source link

GitHub認証を行う範囲が広すぎる #1363

Open hotate29 opened 1 year ago

hotate29 commented 1 year ago

現在の実装では、WebAPIへの全てのリクエストをGithubAuthenticationミドルウェアに通しています。

https://github.com/kenkoooo/AtCoderProblems/blob/ff203e2dc12fece1e5c85dfcbd92db7312313634/atcoder-problems-backend/src/server/mod.rs#L19-L41

このミドルウェアは、Cookieにtokenが含まれている時に動作するもので、GitHubのWebAPIにリクエストを送ることでtokenを検証しています。

https://github.com/kenkoooo/AtCoderProblems/blob/ff203e2dc12fece1e5c85dfcbd92db7312313634/atcoder-problems-backend/src/server/middleware/github_auth.rs#L123-L151

https://github.com/kenkoooo/AtCoderProblems/blob/ff203e2dc12fece1e5c85dfcbd92db7312313634/atcoder-problems-backend/src/server/middleware/github_auth.rs#L69-L81

この検証には結構時間がかかっているようで、ログイン時とそうでない時を比べると、大体250msの差があります。

URL token 平均時間(範囲)
/atcoder-api/v3/user/ac_rank?user=hotate29 なし 107ms(89~135ms)
/atcoder-api/v3/user/ac_rank?user=hotate29 あり 361ms(306~440ms)
/atcoder-api/v3/user/rated_point_sum_rank?user=hotate29 なし 106ms(98~122ms)
/atcoder-api/v3/user/rated_point_sum_rank?user=hotate29 あり 361ms(309~505ms)
/internal-api/user/get (当然)あり 363ms(299~409ms)

(hyperfineを使って、curlでリクエストを10回飛ばして計測しました)

/internal-apiに属しているエンドポイントにGithubTokenを提供するのが目的ですが、それを必要としない他のエンドポイントへのリクエストでも関係なく検証が行われるのでパフォーマンス的に問題かもしれません。

Lambdaの料金体系はよく知らない(ms単位の実行時間で課金されるらしい程度)のですが、これをどうにかしたら費用面が少し良くなるかも?と思いました。

どうにかする方策としては

といったものがあって、おそらく最後のものが無難かなあと思います。