node.jsで建てたサーバー内にある画像にアクセスする方法
まず、これが基本です。
adminのjsファイルがpublicディレクトリ内にあり、「これってセキュリティ的にどうなの?」ということでadminディレクトリに移しました。
それは守るべき情報の重さや重要度で設計するべきことです。
そもそも、このadmin.jsとはどんなスクリプトファイルでしょう。
DBのテーブル構成やログインパス等のクリティカルな情報をバンバン載せたスクリプトファイルなのですか?
そうではなくAjax通信を行うコードしか書かれておらず、
ログインにはCookieによるセッションやトークンの仕組みが必要で
万が一漏れたとしても第三者からのアクセスは弾く仕組みになっているのであればあまりシビアに考える必要はありません。
堅牢に作るなら、せっかくのマイクロサービス的な長所を活かせるNode.jsなので、
管理者用のサイトはプロジェクト自体を分離して、別サーバとして8080や30000等のポートでやり取りするといった案もあります。
従って、まず貴方が行うべきことはadmin.jsファイルをpublicディレクトリに設置した人にヒアリングすることです。
どなたかいい方法教えてください~~。。
利用者用(80番ポート)と管理者用(8080番ポート)で分けるのが簡単、わかりやすく、効果も高いのでオススメです。
DB周りの記述が二重になるのでどうやってコピペを防ぐかの設計がエンジニアの腕の見せどころになるかと思います。
既存のまま作るならエンドポイントが1個増える形になるでしょう。
Express 4.x APIあたりを見ながら頑張って実装してください。
JavaScript
1var fs = require('fs');
2var express = require('express');
3var app = express();
4app.use(express.static('public'));
5
6app.get('/admin/admin.js', (req, res) => {
7 // 管理者用画面と同じパスワード認証ロジックを利用する。
8 // クッキーのセッションあたりの確認になるか?
9 res.sendFile(`${__dirname}/admin/admin.js`);
10});
【おまけ】なんとか同じサーバで上手く共用させられないか
エンドポイントで縛る方法があります。
middlewareがぴったりなので、辛いでしょうが解説しますので頑張って読んでください。
app.use([path,] callback [, callback...])
Expressに於けるミドルウェアは、req, res, next
の順番で引数を要求する関数を指します。
JavaScript
1var express = require('express');
2var app = express();
3app.use(function (req, res, next) {
4 // リクエストのパスが一致しなかったら勝手に400番エラー返すようにしよう
5 if (req.params.pass === 'my_password') {
6 // 認証出来たリクエストは次へ
7 next();
8 } else {
9 // 認証失敗したリクエストは400エラー返して殺す
10 res.status(499).end('リクエストは失敗です。');
11 // nextを実行しなければ自動的にそこで止まる
12 }
13});
これをかっこよく別ファイルに移動するとmiddlewareになります。
JavaScript
1// app.js
2var express = require('express');
3var my_auth = require('./my_auth.js');
4var app = express();
5app.use(my_auth);
6
7// my_auth.js
8module.exports = function (req, res, next) {
9 if (req.params.pass === 'my_password') {
10 next();
11 } else {
12 res.status(499).end('リクエストは失敗です。');
13 }
14}
次、app.useは第一引数に文字列を設定出来ます。
admin配下にだけ適用したければ下記のように記載すれば済むでしょう。
JavaScript
1app.use('/admin(/*)?', my_auth);
このようにadmin配下は認証機能を仕込んでおけば、publicディレクトリ配下にadmin/index.jsみたいなファイルが設置してあっても認証が必要になりそうです。
useは上に指定した順番で適用されていくので、
express.static
より前に書けば認証で守れたかと思います(未確認なので検証してみてください)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。