Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

/signin の設計がおかしい可能性がある #14699

Closed
1 task
syuilo opened this issue Oct 4, 2024 · 39 comments · Fixed by #14700
Closed
1 task

/signin の設計がおかしい可能性がある #14699

syuilo opened this issue Oct 4, 2024 · 39 comments · Fixed by #14700
Labels
🔥high priority packages/backend Server side specific issue/PR packages/frontend Client side specific issue/PR

Comments

@syuilo
Copy link
Member

syuilo commented Oct 4, 2024

Summary

仕様通り想定して飛んできているリクエストに対してエラーを返すのはおかしい

Purpose

Do you want to implement this feature yourself?

  • Yes, I will implement this by myself and send a pull request
@syuilo syuilo added packages/frontend Client side specific issue/PR packages/backend Server side specific issue/PR 🔥high priority labels Oct 4, 2024
@kakkokari-gtyih
Copy link
Contributor

kakkokari-gtyih commented Oct 4, 2024

成功時も次の入力項目を指示するときも200にして、レスポンスをこんな感じにする?

成功時

{
    "success": true,
    "id": "xxxxxxxx",
    "i": "xxxxxxxx"
}

次の入力項目を指示

{
    "success": false,
    "next": "password"
}

@syuilo
Copy link
Member Author

syuilo commented Oct 4, 2024

そうね

@kakkokari-gtyih
Copy link
Contributor

これでいくか

@syuilo
Copy link
Member Author

syuilo commented Oct 4, 2024

successというよりfinishとかの方がよさそう

@kakkokari-gtyih
Copy link
Contributor

kakkokari-gtyih commented Oct 4, 2024

うーん資格情報が足りない状態でのレスポンスに200は強い違和感を持ちますね

403が違うってのは多分そうなのですが、401は不適当ですし400あたりがよいと私は感じます (#14700 (comment))

@syuilo

@anatawa12
Copy link
Member

仕様通り想定して飛んできているリクエストに対してエラーを返すのはおかしい

私はおかしくないと思います。

資格情報が足りない状態でのレスポンスに200は強い違和感を持ちます

403が違うってのはある程度同意しますし、401は不適当ですし400あたりがよいと私は感じます

@syuilo
Copy link
Member Author

syuilo commented Oct 4, 2024

API側の実装がこれで正しいとしたら、クライアント側をエラーが出ないようにリクエストするように修正するべきだわね

@kakkokari-gtyih
Copy link
Contributor

kakkokari-gtyih commented Oct 4, 2024

API側の実装がこれで正しいとしたら、クライアント側をエラーが出ないようにリクエストするように修正するべきだわね

200を返さずにエラーを出さずにそれをしようとしたら結局前のログイン画面に戻ってしまう(新ログイン画面はエラーが返ってくる or 次の操作が示されることを前提に組まれている)

@syuilo
Copy link
Member Author

syuilo commented Oct 4, 2024

そう、だからどちらかの設計がおかしいということになる

@kakkokari-gtyih
Copy link
Contributor

エラーとして返ってくるのってそんなにまずいかしら

@syuilo
Copy link
Member Author

syuilo commented Oct 4, 2024

そもそもsigninという名のAPIがsignin以外の処理(次のステップを指定するなど)を担当している時点で若干おかしい

@syuilo
Copy link
Member Author

syuilo commented Oct 4, 2024

エラーとして返ってくるのってそんなにまずいかしら

とてもまずい
発生したエラーを報告するような仕組みが入っていたとしたら、(正常な手順で)ログインするたびにエラーが報告されることになる

@anatawa12
Copy link
Member

4xxを期待してリクエストすることも私はおかしくないと考えます。

私はHTTPのステータスコード上のエラーとプログラム上のthrowされるようなエラーとは別物と考えてます

@syuilo
Copy link
Member Author

syuilo commented Oct 4, 2024

ステータスコードじゃなく、実際にプログラム上もエラーやfailedとして表現されている

@anatawa12
Copy link
Member

バックエンド的にはエラーではあると思う。

フロント的にはthrowしない方が適切かも

@syuilo
Copy link
Member Author

syuilo commented Oct 4, 2024

バックエンド的にエラーなのだとしたら、フロントエンドはバックエンドがエラーになってしまわないように正しく実装するべきという話になる
でも現在のフロントエンドの実装が問題ないのだとしたら間違っているのはバックエンドということになりそう

@anatawa12
Copy link
Member

そもそもsigninという名のAPIがsignin以外の処理(次のステップを指定するなど)を担当している時点で若干おかしい

これも資格情報不足でチャレンジ種別を返すはそこまでおかしくないと思います(401もそうなってるし)

@kakkokari-gtyih
Copy link
Contributor

フロント的にはthrowしない方が適切かも

これはそうしてあるはず

@syuilo
Copy link
Member Author

syuilo commented Oct 4, 2024

そこまでおかしくはないけど、ちょっとはおかしい(直感的ではない)
ちょっとでもおかしいのであれば直した方が良い

@anatawa12
Copy link
Member

別のエンドポイントとして必要資格情報を返すエンドポイントは追加した方が良いかも

けどsigninは足りない資格情報がある時は4xxを返してあげるべきだと思う。(ここに必要資格情報を含めるかはどっちでもいいけど今あるならついてて良さそう)

@kakkokari-gtyih
Copy link
Contributor

kakkokari-gtyih commented Oct 4, 2024

別のエンドポイントとして必要資格情報を返すエンドポイントは追加した方が良いかも

これすると二要素認証が有効化されているかどうかなどが簡単に取れてしまう(UserDetailedに二要素認証関連のプロパティが公開されているのと何ら変わらなくなる)ので目的を達成できなくなる(工夫次第かも?)

@syuilo
Copy link
Member Author

syuilo commented Oct 4, 2024

エンドポイント分けると場合によってはリクエストが二度手間というか無駄になる場合がありそう

@anatawa12
Copy link
Member

これすると二要素認証が有効化されているかどうかなどが簡単に取れてしまう(UserDetailedに二要素認証関連のプロパティが公開されているのと何ら変わらなくなる)ので目的を達成できなくなる(工夫次第かも?)

これサインイン試行でも同じこと起きるものだと私は認識してるのですが違う感じですか(現状の理解不足があるかも)

@kakkokari-gtyih
Copy link
Contributor

発生したエラーを報告するような仕組みが入っていたとしたら、(正常な手順で)ログインするたびにエラーが報告されることになる

そういうシステムって単純なHTTPリクエストのエラーもログ取るの?(throwされたときやUnhandled Exceptionに動くものだと思っていたけど)

@kakkokari-gtyih
Copy link
Contributor

kakkokari-gtyih commented Oct 4, 2024

これすると二要素認証が有効化されているかどうかなどが簡単に取れてしまう(UserDetailedに二要素認証関連のプロパティが公開されているのと何ら変わらなくなる)ので目的を達成できなくなる(工夫次第かも?)

これサインイン試行でも同じこと起きるものだと私は認識してるのですが違う感じですか(現状の理解不足があるかも)

二要素認証(ワンタイムパスワード)が必要かどうかはパスワードを入力して送信するまでわからない(次に必要な資格情報を一回ごとに返す仕様になっているので)

@syuilo
Copy link
Member Author

syuilo commented Oct 4, 2024

エラーとして返ってくるのってそんなにまずいかしら

とてもまずい 発生したエラーを報告するような仕組みが入っていたとしたら、(正常な手順で)ログインするたびにエラーが報告されることになる

一般にエラーは問題だとして通知・報告される傾向にある
例えばブラウザの開発者ツールでもリクエストがエラーになったら目立つようにされている
けど今回のケースはこれら一連のフローは事前に想定されたもので、すべて仕様通りに動いてるわけだから問題であるとして通知される必要はない

@kakkokari-gtyih
Copy link
Contributor

確かに想定されたリクエストがエラーとして表示されるのは気持ち悪いかも vs 一般のWebアプリとかのAPI見たらちゃんと対応するステータスコード返しているので問題ないのかも

image

@anatawa12
Copy link
Member

二要素認証(ワンタイムパスワード)が必要かどうかはパスワードを入力して送信するまでわからない(次に必要な資格情報を一回ごとに返す仕様になっているので)

なるほど

エラーを集める仕組みにかんしては後処理でどうにかするべきな気がする

別言語の例になっちゃうけどjavaのClassLoaderではとあるローダで見つからなかったのを例外とするんだけど、複数のローダを組み合わせて使う場合はそのエラーは別のローダへのフォールバックのトリガーになるので、ある意味意図しているもので、そういうのはthrowされたタイミングでログが残されるべきではないし残されないようにログの収集側がするべきだと私は思ってる

@syuilo
Copy link
Member Author

syuilo commented Oct 4, 2024

本当に対応したステータスコードなのだろうか?

@syuilo
Copy link
Member Author

syuilo commented Oct 4, 2024

API側もこのフローを想定して実装されているのだから、エラー系のステータスコードを返すのはおかしいように思う

@syuilo
Copy link
Member Author

syuilo commented Oct 4, 2024

エラートラッキングサービスなどがあることからも分かるように、エラーは

  • 報告されるべきもの
  • 起こしてはならないもの
  • 修正されるべきもの

といった観念が含まれているけど、今回はどれにも当てはまらない(仕様通りでこれを前提としたフローなのだから報告される必要もないし起こしてはならないものでもないし修正されるべきものでもない)

@anatawa12
Copy link
Member

HTTPのステータスコードには起こさないべきものという程の意味はないと思うけどなぁ...(そういう意味付けをしてるツールがあるかもしれないけど)

400はリクエストのどっかが期待したもの(今回は2faトークン等)ではなかったということで、実際サインインするという操作については足りないっていうエラーを返すべきだと思う

@syuilo
Copy link
Member Author

syuilo commented Oct 4, 2024

実態にあまりそぐわない /signin という名前だから「情報が足りなかったらエラーにする」のが正しいように思えてしまうのだと思う
これが /process-signin-flow みたいな名前だとしたらどうだろうか

@kakkokari-gtyih
Copy link
Contributor

MisskeyはRESTじゃないからべつに #14699 (comment) のプラクティスに絶対に則っておくべきということはない(これが公開APIなら仕様が一般的ではなく受け入れ難いかもしれないけど、内部API(外部アプリが使用しないエンドポイント)なのでそのへんのハンドリングはある程度やりやすいようにしても良いのかも)

@anatawa12
Copy link
Member

これが /process-signin-flow みたいな名前だとしたらどうだろうか

あーこれなら200でもいいと感じる

@syuilo
Copy link
Member Author

syuilo commented Oct 4, 2024

このAPIはサインインするにあたっての情報が足りない状態でリクエストされることを期待しているのだから何もエラー要素がない

@kakkokari-gtyih
Copy link
Contributor

kakkokari-gtyih commented Oct 4, 2024

これが /process-signin-flow みたいな名前だとしたらどうだろうか

仮に /process-signin-flow 的な名称にするとして、/signin は消す?(Misskey Web上にあるのは対話式のサインインのみなのでおそらく使う機会はなくなる)

@syuilo
Copy link
Member Author

syuilo commented Oct 4, 2024

消す

@kakkokari-gtyih
Copy link
Contributor

/signin-flow とかでも良さそう

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🔥high priority packages/backend Server side specific issue/PR packages/frontend Client side specific issue/PR
Projects
None yet
3 participants