teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

おまけ追加

2017/12/20 06:27

投稿

miyabi-sun
miyabi-sun

スコア21461

answer CHANGED
@@ -40,4 +40,61 @@
40
40
  // クッキーのセッションあたりの確認になるか?
41
41
  res.sendFile(`${__dirname}/admin/admin.js`);
42
42
  });
43
- ```
43
+ ```
44
+
45
+ ---
46
+
47
+ 【おまけ】なんとか同じサーバで上手く共用させられないか
48
+
49
+ エンドポイントで縛る方法があります。
50
+ middlewareがぴったりなので、辛いでしょうが解説しますので頑張って読んでください。
51
+ [app.use([path,] callback [, callback...])](http://expressjs.com/ja/api.html#app.use)
52
+
53
+ Expressに於けるミドルウェアは、`req, res, next`の順番で引数を要求する関数を指します。
54
+
55
+ ```JavaScript
56
+ var express = require('express');
57
+ var app = express();
58
+ app.use(function (req, res, next) {
59
+ // リクエストのパスが一致しなかったら勝手に400番エラー返すようにしよう
60
+ if (req.params.pass === 'my_password') {
61
+ // 認証出来たリクエストは次へ
62
+ next();
63
+ } else {
64
+ // 認証失敗したリクエストは400エラー返して殺す
65
+ res.status(499).end('リクエストは失敗です。');
66
+ // nextを実行しなければ自動的にそこで止まる
67
+ }
68
+ });
69
+ ```
70
+
71
+ これをかっこよく別ファイルに移動するとmiddlewareになります。
72
+
73
+ ```JavaScript
74
+ // app.js
75
+ var express = require('express');
76
+ var my_auth = require('./my_auth.js');
77
+ var app = express();
78
+ app.use(my_auth);
79
+
80
+ // my_auth.js
81
+ module.exports = function (req, res, next) {
82
+ if (req.params.pass === 'my_password') {
83
+ next();
84
+ } else {
85
+ res.status(499).end('リクエストは失敗です。');
86
+ }
87
+ }
88
+ ```
89
+
90
+ 次、app.useは第一引数に文字列を設定出来ます。
91
+ admin配下にだけ適用したければ下記のように記載すれば済むでしょう。
92
+
93
+ ```JavaScript
94
+ app.use('/admin(/*)?', my_auth);
95
+ ```
96
+
97
+ このようにadmin配下は認証機能を仕込んでおけば、publicディレクトリ配下にadmin/index.jsみたいなファイルが設置してあっても認証が必要になりそうです。
98
+
99
+ useは上に指定した順番で適用されていくので、
100
+ `express.static`より前に書けば認証で守れたかと思います(未確認なので検証してみてください)