😽

Node Express Passport ダイジェスト認証

2022/06/25に公開約2,900字

ダイジェスト認証とは

Digest認証は、Basic認証の欠点を改善した認証方式データをハッシュ化して送ります。

作成方法

ディレクトリを作成します。

md digest
cd digest

プロジェクトを初期化します。

npm init -y

必要なモジュールをインストールします。

npm install express passport passport-http

ファイル名app.jsを新規作成、下記のコードを記載します。

const express = require('express');
const passport = require('passport');
const passportHttp = require('passport-http')
const app = express();

const record = { username: 'user', password: 'pass' }
passport.use(new passportHttp.DigestStrategy({ qop: 'auth'} ,
 (username,cb) => {
    if (username === record.username) {
      return cb(null, username, record.password);
    } else {
      return cb(null,false)
    }
  }
));

app.get('/',
  passport.authenticate('digest', {
    session: false
  }),
   (req, res) => {
    res.send('認証されました')
  });

app.listen(3000, () => console.log('listening on port 3000!'))
node app.js 

を起動します。

次にVisual Studio Codeの機能拡張で、Rest Clientをインストールし同じフォルダにサーバーに認証されたユーザーのuser.httpを作成し下記を記載します。

GET http://127.0.0.1:3000 HTTP/1.1
Authorization: Digest user pass

Send Requestを押すと以下に正常に認証するレスポンスが返却されます。

HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 21
ETag: W/"15-AeVImKWjpH0ackqigmY5l7mJ8Zs"
Date: Sat, 25 Jun 2022 14:01:45 GMT
Connection: close
認証されました

次のサーバーに認証されていないユーザー
nouser.httpを作ります。

GET http://127.0.0.1:3000 HTTP/1.1
Authorization: Digest nouser pass

Send Requestを押すと認証されないレスポンスが返却されます。

HTTP/1.1 401 Unauthorized
X-Powered-By: Express
WWW-Authenticate: Digest realm="Users", nonce="w71LHOZ2zjn2PnX434T4ujUeQ1mbCQih", qop="auth"
Date: Sat, 25 Jun 2022 14:03:26 GMT
Connection: close
Content-Length: 12
Unauthorized

さらにユーザーであるがパスワードが間違っているパスワード
nopass.httpを作ります。

GET http://127.0.0.1:3000 HTTP/1.1
Authorization: Digest user nopass

Send Requestを押すと認証されないレスポンスが返却されます。

HTTP/1.1 401 Unauthorized
X-Powered-By: Express
WWW-Authenticate: Digest realm="Users", nonce="iBnVfsyvbIVh9NK5Ew35H5DRH582L848", qop="auth"
Date: Sat, 25 Jun 2022 14:05:37 GMT
Connection: close
Content-Length: 12
Unauthorized

以上となります。Node.js Express passportでダイジェスト認証を行ないました。

ちなみにRest Clientのファイルは、user.httpに、nouser.httpとnopass.httpを複数行書いて
### でコマンドを区切ると、1つのファイル内に複数コマンドを書けます。
user.http

GET http://127.0.0.1:3000 HTTP/1.1
Authorization: Digest user pass
###
GET http://127.0.0.1:3000 HTTP/1.1
Authorization: Digest nouser pass
###
GET http://127.0.0.1:3000 HTTP/1.1
Authorization: Digest user nopass

Discussion

ログインするとコメントできます