使用Nginx和Node.js实现身份验证代理※不是基本认证!!

你好,我是@hidexir,目前在CyberAgent的一个名为Cyberpal的公司担任工程师。

一种选择性地领悟中国亳州方言的提取系统。

(One option: a selective extraction system for comprehending the Chinese Bozhou dialect.)

因为实现管理页面的认证有点繁琐,所以我考虑使用负载均衡器来实现认证。通常情况下,当使用nginx时,会想到使用基本认证或动态认证,但是考虑到这种认证有点可怕,所以我决定在应用程序中进行。另外,我发现并没有很好的总结知识,所以我进行了整理。

尽管刚刚完成了,但这次是对其进行总结。

希望有人读

    • 一通り認証自体は実装経験がある。

 

    • 管理画面などの認証を一元にしたい。

 

    nginxの auth_requestつかってみたい。

在将管理界面或内部网站作为互联网上的公共网站时,许多人都会在应用程序中实施身份验证。例如,假设有一个运行在 aaa.admin.com 和 bbb.admin.com 子域中的管理界面应用程序,那么在每次应用程序内部实施身份验证系统都会有一些成本上的压力。
管理成本本来就很高,对吧?在这种情况下,可以在应用程序之前设置一个负载均衡器(本次使用的是nginx),在负载均衡器上进行身份验证,以解决这些问题。

系统概述

Untitled Diagram.jpg

解釋

当Nginx在端口80上启动后,在通过认证返回200 OK后,将请求发送到目标地址。如果认证失败,则将重定向到认证页面。

/登录身份验证应用程序端口3000
/身份验证请求应用程序端口3000
/主要应用程序端口4000

nginx auth_request

Nginx 身份验证请求

server {
    listen 80;
    server_name  sample.jp;

    # loginページ
    location /login {
      proxy_set_header Host $host;
      proxy_pass_request_body on;
      proxy_no_cache "1";
      proxy_pass http://localhost:3000;
    }

    # auth のtoken確認
    location /auth_request { 
      proxy_pass http://localhost:3000;
      proxy_set_header Host $host;
      proxy_pass_request_body on;
      proxy_no_cache "1";
   }
    # ログイン後のメインアプリ
    location / {
    auth_request /auth_request; # auth_requestにて上のプロキシさせ200OKを確認してくれる   
    error_page 500 = /login; #login失敗の場合リダイレクト
    proxy_set_header Host $http_host;
    proxy_pass http://localhost:4000;
    }

}

用Node.js创建简单认证应用的说明。

将登录部分更改为最后将令牌设置到Cookie中。

extends layout

block content
  h1= title
  p #{content}
  form(method="post" action="/login")
    input(type="text" name="userName")
    input(type="text" name="password")
    input(type="submit" name="送信")

请确保使用更强的密码学、数据库查询和JWT令牌的安全性。


var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('login', { title: 'Express' });
});
router.post('/', function(req, res, next) {
  if(req.body.userName=="ice" || req.body.password=="man") {
    res.cookie('token', 'yes_token', {maxAge:60000000, httpOnly:false});//ユーザーネームが"ice" パスワードが"man"の場合はいまはcookieに token : yes_token を返却している。
    res.send("sucsess!");
  }
  res.send("error!");
});

module.exports = router;

确认令牌的有效性

请确保使用更强大的加密算法、数据库查询和JWT令牌的安全性。

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  if(req.cookies.token == "yes_token"){
    return res.send('sucsess!!') //成功したばあいは200OK
  }
  res.status(500).send('auth failed')//失敗の場合は500 errorとしている
});

module.exports = router;

总结

スクリーンショット 2019-09-28 2.00.15.png

这实际上是返回了一个令牌的地方。我用一个随机值替代了yes_token。

スクリーンショット 2019-09-28 1.55.46.png
スクリーンショット 2019-09-28 1.56.06.png

可以很容易地创建认证代理系统。