Closed syuilo closed 1 week ago
成功時も次の入力項目を指示するときも200にして、レスポンスをこんな感じにする?
{
"success": true,
"id": "xxxxxxxx",
"i": "xxxxxxxx"
}
{
"success": false,
"next": "password"
}
そうね
これでいくか
successというよりfinishとかの方がよさそう
うーん資格情報が足りない状態でのレスポンスに200は強い違和感を持ちますね
403が違うってのは多分そうなのですが、401は不適当ですし400あたりがよいと私は感じます (https://github.com/misskey-dev/misskey/pull/14700#issuecomment-2393353797)
@syuilo
仕様通り想定して飛んできているリクエストに対してエラーを返すのはおかしい
私はおかしくないと思います。
資格情報が足りない状態でのレスポンスに200は強い違和感を持ちます
403が違うってのはある程度同意しますし、401は不適当ですし400あたりがよいと私は感じます
API側の実装がこれで正しいとしたら、クライアント側をエラーが出ないようにリクエストするように修正するべきだわね
API側の実装がこれで正しいとしたら、クライアント側をエラーが出ないようにリクエストするように修正するべきだわね
200を返さずにエラーを出さずにそれをしようとしたら結局前のログイン画面に戻ってしまう(新ログイン画面はエラーが返ってくる or 次の操作が示されることを前提に組まれている)
そう、だからどちらかの設計がおかしいということになる
エラーとして返ってくるのってそんなにまずいかしら
そもそもsigninという名のAPIがsignin以外の処理(次のステップを指定するなど)を担当している時点で若干おかしい
エラーとして返ってくるのってそんなにまずいかしら
とてもまずい 発生したエラーを報告するような仕組みが入っていたとしたら、(正常な手順で)ログインするたびにエラーが報告されることになる
4xxを期待してリクエストすることも私はおかしくないと考えます。
私はHTTPのステータスコード上のエラーとプログラム上のthrowされるようなエラーとは別物と考えてます
ステータスコードじゃなく、実際にプログラム上もエラーやfailedとして表現されている
バックエンド的にはエラーではあると思う。
フロント的にはthrowしない方が適切かも
バックエンド的にエラーなのだとしたら、フロントエンドはバックエンドがエラーになってしまわないように正しく実装するべきという話になる でも現在のフロントエンドの実装が問題ないのだとしたら間違っているのはバックエンドということになりそう
そもそもsigninという名のAPIがsignin以外の処理(次のステップを指定するなど)を担当している時点で若干おかしい
これも資格情報不足でチャレンジ種別を返すはそこまでおかしくないと思います(401もそうなってるし)
フロント的にはthrowしない方が適切かも
これはそうしてあるはず
そこまでおかしくはないけど、ちょっとはおかしい(直感的ではない) ちょっとでもおかしいのであれば直した方が良い
別のエンドポイントとして必要資格情報を返すエンドポイントは追加した方が良いかも
けどsigninは足りない資格情報がある時は4xxを返してあげるべきだと思う。(ここに必要資格情報を含めるかはどっちでもいいけど今あるならついてて良さそう)
別のエンドポイントとして必要資格情報を返すエンドポイントは追加した方が良いかも
これすると二要素認証が有効化されているかどうかなどが簡単に取れてしまう(UserDetailedに二要素認証関連のプロパティが公開されているのと何ら変わらなくなる)ので目的を達成できなくなる(工夫次第かも?)
エンドポイント分けると場合によってはリクエストが二度手間というか無駄になる場合がありそう
これすると二要素認証が有効化されているかどうかなどが簡単に取れてしまう(UserDetailedに二要素認証関連のプロパティが公開されているのと何ら変わらなくなる)ので目的を達成できなくなる(工夫次第かも?)
これサインイン試行でも同じこと起きるものだと私は認識してるのですが違う感じですか(現状の理解不足があるかも)
発生したエラーを報告するような仕組みが入っていたとしたら、(正常な手順で)ログインするたびにエラーが報告されることになる
そういうシステムって単純なHTTPリクエストのエラーもログ取るの?(throwされたときやUnhandled Exceptionに動くものだと思っていたけど)
これすると二要素認証が有効化されているかどうかなどが簡単に取れてしまう(UserDetailedに二要素認証関連のプロパティが公開されているのと何ら変わらなくなる)ので目的を達成できなくなる(工夫次第かも?)
これサインイン試行でも同じこと起きるものだと私は認識してるのですが違う感じですか(現状の理解不足があるかも)
二要素認証(ワンタイムパスワード)が必要かどうかはパスワードを入力して送信するまでわからない(次に必要な資格情報を一回ごとに返す仕様になっているので)
エラーとして返ってくるのってそんなにまずいかしら
とてもまずい 発生したエラーを報告するような仕組みが入っていたとしたら、(正常な手順で)ログインするたびにエラーが報告されることになる
一般にエラーは問題だとして通知・報告される傾向にある 例えばブラウザの開発者ツールでもリクエストがエラーになったら目立つようにされている けど今回のケースはこれら一連のフローは事前に想定されたもので、すべて仕様通りに動いてるわけだから問題であるとして通知される必要はない
確かに想定されたリクエストがエラーとして表示されるのは気持ち悪いかも vs 一般のWebアプリとかのAPI見たらちゃんと対応するステータスコード返しているので問題ないのかも
二要素認証(ワンタイムパスワード)が必要かどうかはパスワードを入力して送信するまでわからない(次に必要な資格情報を一回ごとに返す仕様になっているので)
なるほど
エラーを集める仕組みにかんしては後処理でどうにかするべきな気がする
別言語の例になっちゃうけどjavaのClassLoaderではとあるローダで見つからなかったのを例外とするんだけど、複数のローダを組み合わせて使う場合はそのエラーは別のローダへのフォールバックのトリガーになるので、ある意味意図しているもので、そういうのはthrowされたタイミングでログが残されるべきではないし残されないようにログの収集側がするべきだと私は思ってる
本当に対応したステータスコードなのだろうか?
API側もこのフローを想定して実装されているのだから、エラー系のステータスコードを返すのはおかしいように思う
エラートラッキングサービスなどがあることからも分かるように、エラーは
といった観念が含まれているけど、今回はどれにも当てはまらない(仕様通りでこれを前提としたフローなのだから報告される必要もないし起こしてはならないものでもないし修正されるべきものでもない)
HTTPのステータスコードには起こさないべきものという程の意味はないと思うけどなぁ...(そういう意味付けをしてるツールがあるかもしれないけど)
400はリクエストのどっかが期待したもの(今回は2faトークン等)ではなかったということで、実際サインインするという操作については足りないっていうエラーを返すべきだと思う
実態にあまりそぐわない /signin という名前だから「情報が足りなかったらエラーにする」のが正しいように思えてしまうのだと思う これが /process-signin-flow みたいな名前だとしたらどうだろうか
MisskeyはRESTじゃないからべつに https://github.com/misskey-dev/misskey/issues/14699#issuecomment-2393416190 のプラクティスに絶対に則っておくべきということはない(これが公開APIなら仕様が一般的ではなく受け入れ難いかもしれないけど、内部API(外部アプリが使用しないエンドポイント)なのでそのへんのハンドリングはある程度やりやすいようにしても良いのかも)
これが /process-signin-flow みたいな名前だとしたらどうだろうか
あーこれなら200でもいいと感じる
このAPIはサインインするにあたっての情報が足りない状態でリクエストされることを期待しているのだから何もエラー要素がない
これが /process-signin-flow みたいな名前だとしたらどうだろうか
仮に /process-signin-flow
的な名称にするとして、/signin
は消す?(Misskey Web上にあるのは対話式のサインインのみなのでおそらく使う機会はなくなる)
消す
/signin-flow
とかでも良さそう
Summary
仕様通り想定して飛んできているリクエストに対してエラーを返すのはおかしい
Purpose
あ
Do you want to implement this feature yourself?