單點登錄(sso)的簡單實現

48540923dd54564e4c3e6c84bbde9c82d1584f30.png

單點登錄(Single Sign On):簡稱為 SSO,是比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。

下面我們實現一個簡單的Demo:

預備安裝好nodeexpress

接下來我們實現一個服務,接下來的我們頁面請求的服務都將請求此處,如下圖1.js:

var express = require('express');
var app = express();

app.all('*', function (req, res, next) {
  res.header('Access-Control-Allow-Origin', req.headers.origin);
  //Access-Control-Allow-Headers ,可根據瀏覽器的F12查看,把對應的粘貼在這里就行
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  res.header('Access-Control-Allow-Methods', '*');
  res.header("Access-Control-Allow-Credentials",true);
  res.header('Content-Type', 'application/json;charset=utf-8');
  next();
});

app.get('/', function(req, res,next){
  res.cookie('rememberme', '999991', { expires: new Date(Date.now() + 900000), httpOnly: true });
  res.send('var ss="hello world"');
});
app.get('/aa/', function(req, res,next){
  console.log("headers = " + JSON.stringify(req.headers));// 包含了各種header,包括x-forwarded-for(如果被代理過的話)
  console.log("x-forwarded-for = " + req.header('x-forwarded-for'));// 各階段ip的CSV, 最左側的是原始ip
  console.log("ips = " + JSON.stringify(req.ips));// 相當于(req.header('x-forwarded-for') || '').split(',')
  console.log("remoteAddress = " + req.connection.remoteAddress);// 未發生代理時,請求的ip
  console.log("ip = " + req.ip);// 同req.connection.remoteAddress, 但是格式要好一些
  res.send('"hello world"');
});

app.listen(3000);

實現兩個靜態文件訪問服務器:2.js

const express = require('express')
const path = require('path')
const app = express()
// path.join(__dirname, 'public') 表示工程路徑后面追加 public
app.use(express.static(path.join(__dirname, 'publish')))

app.listen(8080, () => {
 console.log(`App listening at port 8080`)
})

3.js

const express = require('express')
const path = require('path')
const app = express()
// path.join(__dirname, 'public') 表示工程路徑后面追加 public
app.use(express.static(path.join(__dirname, 'publish')))

app.listen(8081, () => {
 console.log(`App listening at port 8080`)
})

在創建兩個靜態文件,目錄結構如下圖:

v2-e0cb09d6b8384e5cbda907dfcafcba3e_hd.png

index.html

<!DOCTYPE html>
<html lang="en">

<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>主頁</title>
</head>

<body>
 <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js">
 </script>
 <script src="http://192.168.1.11:3000">

 </script>
</body>

</html>

2.index1.html

<!DOCTYPE html>
<html lang="en">

<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>主頁1</title>
</head>

<body>
 <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js">
 </script>
 <script>
 $.ajax({
 type: "get",
 dataType: "text",
 xhrFields: {
 withCredentials: true
            },
 crossDomain: true,
 url: 'http://192.168.1.11:3000/aa/',
 data: {},
 success: function (data) {
 console.log(data)
            }
        });
 </script>
</body>

</html>

通過上面代碼我們可以了解,我們在3000端口上架設了兩個服務接口,一個是設置cookie,一個是接收并打印用戶傳過來的cokie的;

通過

node 1.js
node 2.js
node 3.js

啟動服務

我本地ip是192.168.1.11,

我們訪問 http://192.168.1.11:8080/index.html

v2-8862e6061c94bd0c63eab54e7e3b3c0f_hd.png

服務端已經在8080端口服務上設置3000端口的cookie

在訪問http://192.168.1.11:8081/index1.html

v2-0e46f475239395407bcb94773f1bae58_hd.png

控制臺已經接收到cookie

v2-c33182b572db552e08072afd8e71bea2_hd.png

到此我們即實現已經完成,我們可以把8080看成a系統,8081看成b系統,這樣只要通過3000(認證平臺),在a、b系統都可以使用認證平臺的cookie

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容