Crescom-SohoCaddie / soho-caddie

MIT License
0 stars 1 forks source link

セッションタイムアウト後のログイン画面はタブレットモードで表示する。 #1045

Closed monomonosu closed 2 years ago

monomonosu commented 2 years ago

何も操作せずに30分経ってからアクションを起こすと、ログイン画面が表示されてログインを促している。 マルチウィンドウモードの際にこれがウィンドウ上に表示されるのをタブレットモードのログイン画面に変更する。

monomonosu commented 2 years ago

@gamasenninn 30分経ったら自動的にログアウト+ログイン画面に遷移するという事だった。 上記コメントの通り、マルチウィンドウモードでもタブレットモードとのログイン画面を表示するようにする事。

monomonosu commented 2 years ago

@gamasenninn 現時点でFlaskのsession_lifetimeを30分に設けているだけだが、これをやるとなるとポーリングのような仕組みを実装する必要が出てくるだろうか。 イベントとなるトリガーが無いといけないよな...と思っている。

monomonosu commented 2 years ago

@gamasenninn 今のところ案が2つほどあるのだが、1つ目は、 ポーリングをするためには定期的にリクエストを送らないといけないわけだが、それを行うとFlaskでのセッションライフタイムは更新される。 独自にsession変数を用意し、ポーリング用のAPIへのリクエスト以外の時にはそのsession変数を更新。ポーリング用APIでリクエスト時に現在の時刻と独自session変数との間に差異が30分以上あればリダイレクトを行う。という感じにするという案。 これの問題点は折角便利なflaskのsession_lifetimeがあるのにそれが利用できない。という点と全APIにセッション変数を更新する処理を加えないといけないという点。

monomonosu commented 2 years ago

@gamasenninn 2つめは、 フロント側で制御してしまうという案。jsのsetTimeout()を使用してしまい、カウントが0になったらリダイレクトをやっちゃう。 画面操作をしたら現在進行中のsetTimeoutを停止、新たにsetTimeoutを実行してカウントダウンを再開始する。 これの問題点は操作一つ一つにsetTimeout破棄→setTimeoutセットをする処理を挟まないといけないという点。かなりきつそう。そして単純に超かっこわるい。

monomonosu commented 2 years ago

@gamasenninn 今の所案1が現実的かなと思ってるんだが、いい案があれば教えて欲しい。

monomonosu commented 2 years ago

Flask_loginのsessionで設定されたcookieはhttponly属性が付いているので、普通にcookieを取得することはできない。 そのためflaskのconfigを設定してやる必要が出てくる。 app.config['SESSION_COOKIE_HTTPONLY'] = False でhttponly属性を切ることが可能。

monomonosu commented 2 years ago

cookieのexpiresを取得するという案の検証を行ったが、下の記事にもあるようにこれはできないっぽい。 https://code-examples.net/ja/q/176121 なので原点回帰で独自にcookieをセットする手法を試した。 APIに以下のような処理を追加することでレスポンスJSONにCookieをセットするレスポンスを追加する事ができた。


from flask import jsonify, make_response

response = make_response(
        jsonify(CustomerSchema(many=True).dump(customers)))
    response.set_cookie("hogehoge",value="hoge--")

    return response
monomonosu commented 2 years ago

しかしながら、これを全APIに対して追加するのは可読性が悪いのでデコレータを使用してレスポンスの追加を行えないかと考え検証してみたが、現在ここで詰んでいる状況。 Flaskのルーティングで使用するデコレータと独自デコレータがバッティングしてしまう?

gamasenninn commented 2 years ago

アイディアとして悪くはない。しかし、デコレータがうまくいったとしても、全APIに適用となると、たかだかリダイレクトでソース量が極大化するのは愚かさを拭えない。リスク対効果のバランスが明らかに悪い。車の運転席をラグジュアリシートに変えて燃費を悪くするようなものである。何らかの軽量でシンプルな方法を模索するか、リダイレクトはやめるか、の選択になると思われる。

gamasenninn commented 2 years ago

焦って実装して燃費の悪いものができても環境に悪いので、引き続き、方法を模索しよう。

monomonosu commented 2 years ago

コード量100とか200行くらい肥大化しそうだもんな。 ちょっとこれは要検討だね。

monomonosu commented 2 years ago

@gamasenninn 30分経ったら自動的にログイン画面に遷移する感じにはしなくてOKとの事。 30分経ってから操作を行ったらタブレットモード時のログイン画面に遷移するようにで大丈夫との事。 つまりは初めの仕様と同じでOK。

gamasenninn commented 2 years ago

@monomonosu 了解。最終的には最初の仕様で実装するとして、もう少しこの件は追求してみる。before_responseですべてのAPIコールはフックされてしまうので、その逃げ道をつくって、セッションが生きているかどうかのAPIを追加してやれば、アプリでリダイレクトコントロールが可能ではないかと考えている。

monomonosu commented 2 years ago

@gamasenninn なるほど、そこで一括できてうまい具合に捌ければそれは理想的だな。