QA@IT

サーバをJSON APIにしたときのログイン認証のコードについて

4481 PV

Node.js / AngularJSでのWebアプリケーション作成に挑戦しております。
サーバ側はJSON形式でデータを提供するAPIとし、動的なページ作成は行わず、
jsを含むhtmlから、サーバサイドのJSONを取得する、という形で考えています。
動的なページを生成する必要がないため、htmlは public/ の下に置きたい(?)と考えております。

ご質問は、ログイン認証に関するコードをどのように書けばよいのかということです。

例を挙げますと、
A.ログインしている場合はページを表示し、ログインしていない場合はログイン画面へリダイレクトする
…サーバ側のルーティングで表示するソースを変えればよいので、特に問題ありません。

B.表示するソース(html)は同じだが、ログインしている場合としていない場合でページの中身を一部変えたい時
例えば、ログインしている場合のみに「編集」ボタンを表示する、などです。

質問は、このような状況での定跡を教えて頂きたいということです。
すなわち、先ほど「動的なページを生成する必要がない」と書きましたが、
上のBのような状況では、例えばjadeのテンプレートで

if req.params.user 
  input(type="button") 編集

のように、
サーバサイドで埋め込むべきなのでしょうか?

正直、質問者が混乱している為、質問自体におかしいところがある可能性があると認識しております。
その場合は遠慮なくご指摘頂きたく思っております。
どうぞよろしくお願い致します。

  • すみません、タグに#が入っていたのですね。パッチ送って頂きありがとうございます。 -

回答

Bについて
編集ボタンを非表示にしておけばよいかと思います。
ログイン済みかどうかはJSONデータでもクッキーでもなにか手がかりを送信しておけばいいでしょう。ユーザーがJSで無理やり表示してしまうなどはデザイン上は無視していいかと。
(表示メカニズムに対して、その段階で部分的なHTMLをリソースとして取得するのか単純にCSSレベルなどでdisplayを切り替えるか…要するにそのタイミングでサーバーアクセスを起こすかどうかもどちらでも良いかなと思います)

編集ボタンが押されたときに、本当にログイン済みユーザーかどうかを判断する方が大事ですね。

Aについて
通常ルートはそういう形で良いかと思いますが、

  • 編集ボタンはログインの有無に関わらず見せておき、押されたタイミングでログインを促す
  • 編集ボタンを押した段階でセッション切れの場合はログインを促す

といったケースに対しては工夫が必要になるかもしれませんね。
この場合は $http.responseInterceptors とか $q.deffer/$q.promiseを使うことになるんでしょうか。
(私も AngularJSはかじった程度なので定石はわかりません、すみません。)

編集 履歴 (0)
  • ご回答を読み、考えがとても整理されました。感謝しております。ご回答の中、>ログイン済みかどうかはJSONデータでもクッキーでもなにか手がかりを送信しておけばいいでしょう。  の部分、具体的にもう少しお聞きしたいことがあり、もし可能でしたらご回答頂けると幸いです。 -
  • >ログイン済みかどうかはJSONデータでもクッキーでもなにか手がかりを送信しておけばいいでしょう。 に関して、サーバ側でログイン時にsessionIDを付与、ログアウト時に消去するとすれば、クライアントサイドで一旦ログインしているかどうかを判断(編集ボタンを表示するかなど)するには、sessionIDが付与されているかどうか、などとしても良いのでしょうか? -
  • それで実現できるならそれでも構わないと思いますが、sessionIDのキーが変わった場合、cookieにHttpOnly属性がつけたくなった場合、ログインしていなくてもセッションを有効にしたい場合などの検討も必要ですね。ダイレクトにngcookieからとらずに関数などにラップしておければまずはそれでもいいんじゃないでしょうか。 -
  • ただ、なるべくsessionIDは隠しておきたいところですので他の形がいいかなと個人的には思います。この辺りはセキュリティ要件にも絡んできますね。 -
  • 追加でのご回答頂きありがとうございました。関数でラップは重要ですね。sessionIDを隠しておきたいというのも確かにそうだなと思いました。一連のご回答を読んで、感覚として掴めて来た気がしています。重ね重ね有り難うございました。 -
  • 余談ですが、ご回答に+1したいのですがレピュテーションが1足りず、持ち越させて下さいm__m -
ウォッチ

この質問への回答やコメントをメールでお知らせします。