返回顶部
首页 > 资讯 > 前端开发 > 其他 >浅析node怎么实现单点登录系统
  • 271
分享到

浅析node怎么实现单点登录系统

nodejsnode 2022-11-22 23:11:31 271人浏览 八月长安
摘要

一. 基础知识1.1 同源策略源 = 协议 + 域名 +端口以Http://www.a.com为例:https://www.a.com ❌(协议不同)http://www.b.com ❌(域名不同)http://www.a.com:3000

一. 基础知识

1.1 同源策略

源 = 协议 + 域名 +端口

Http://www.a.com为例:

  • https://www.a.com ❌(协议不同)
  • http://www.b.com ❌(域名不同)
  • http://www.a.com:3000 ❌(端口不同)

同源策略是浏览器的行为,它通过确保应用下的资源只能被本应用访问,来保证安全。【相关教程推荐:nodejs视频教程】

1.2 会话机制

由于http协议是无状态协议(客户端和服务器端数据交换完毕,会关闭连接,下次请求重新建立连接),但我们需要做记住密码等功能时,很明显需要将会话记录下来。

常用的会话跟踪就是cookie和session,简单的理解它们就是可以存放key,value的数据结构,区别在于cookie保存在客户端,session保存在服务器端。

二. 单点登录

1. 同父域SSO

同父域,如www.app1.aaa.com,www.app2.aaa.com这两个服务器都是在.aaa.com的父域名。
默认情况下,两个服务器下页面之间的cookie是互相访问不到的。

但是我们可以通过设置cookie的domain属性为共通的父域名,使得两个服务器下页面之间的cookie可以相互访问到。

router.get('/createCookie', async (ctx, next) => {
  ctx.cookies.set('username', '123', {
    maxAge: 60 * 60 * 1000,
    httpOnly: false,
    path: '/',
    domain:'.a.com' //设置domain为共通的父域名
  });
  ctx.body = "create cookie ok"})router.get('/getCookie', async (ctx, next) => {
  let username=ctx.cookies.get('username')
  if (username){
    ctx.body=username  }else{
    ctx.body='no cookie'
  }})

在这里插入图片描述

2. 跨域SSO

当我们的域名为www.a.com,www.b.com时,无论怎样设置domain都没用了。

那么就要想办法将身份凭证(token)写入到所有域的cookie中

2.1 跨域写cookie
2.1.1 利用< script />标签跨域写cookie(jsonp)

在http://www.a.com/index.js中直接向https://www.c.com:3000/sso直接发送网络请求,是无法跨域写入cookie的。

  <script>
    $.ajax({
      url: 'https://www.c.com:3000/sso?key=username&value=123',
      method: 'get',
    })
  </script>

但是我们可以通过< script />标签发起跨域请求,写入cookie

<script src="https://www.c.com:3000/sso?key=username&value=123"></script>

或者使用Jquery JSONp的方式发起跨域请求,写入cookie,这种方式的原理也是通过< script />标签能够跨域实现的。

 $.ajax({
      url: 'https://www.c.com:3000/sso?key=username&value=123',
      method: 'get',
      dataType:'jsonp'
    })

这样通过< script />标签就实现了往www.a.com中写入了domain为www.c.com的跨域cookie.
在这里插入图片描述
后端

const options = {
  key: fs.readFileSync(path.join(__dirname, './https/privatekey.pem')),
  cert: fs.readFileSync(path.join(__dirname, './https/certificate.pem')),
  secureOptions: 'TLSv1_2_method' //force TLS version 1.2}var server = https.createServer(options,app.callback());  //只能使用https协议写cookierouter.get('/sso', async (ctx, next) => {
  let {
    key, value  } = ctx.request.query
  ctx.cookies.set(key, value, {
    maxAge: 60 * 60 * 1000, //有效时间,单位毫秒
    httpOnly: false, //表示 cookie 是否仅通过 HTTP(S) 发送,, 且不提供给客户端 javascript (默认为 true).
    path: '/',
    sameSite: 'none', //限制第三方 Cookie
    secure: true //cookie是否仅通过 HTTPS 发送
  });
  ctx.body = 'create Cookie ok'})

注意:

  • 浏览器未写入cookie报错his set-cookie was blocked due to http-only
    http-only:表示 cookie 是否仅通过 HTTP(S) 发送,, 且不提供给客户端 JavaScript (默认为 true).
    所以要将httpOnly设置为false.

  • 浏览器未写入cookie报错this set-cookie was blocked due to user preference
    这个真的坑,因为我是无痕模式打开的浏览器,但是chrome浏览器默认无痕模式下禁用第三方cookie,修改为允许所有cookie就行了.
    在这里插入图片描述

  • 浏览器未写入cookie报错this set cookie was blocked because it has the SameSite attribute but Secure not set
    需要设置sameSite和secure属性

  • 浏览器未写入cookie报错server error Error: Cannot send secure cookie over unencrypted connection
    这个我觉得是koa框架写cookie的限制吧,它只能支持https写cookie…,于是我把www.c.com改为了https服务器.

2.1.2 p3p协议头实现IE浏览器跨域

上面说的jsonp的方式在chrome浏览器中完美运行,但是IE浏览器对于cookie更加严格,只用上面方式无法写入cookie,解决办法就是加上p3p的响应头。

router.get('/sso', async (ctx, next) => {
  let {
    key, value  } = ctx.request.query
  ctx.cookies.set(key, value, {
    maxAge: 60 * 60 * 1000, //有效时间,单位毫秒
    httpOnly: false,
    path: '/',
    sameSite: 'none',
    secure: true
  });
  ctx.set("P3P", "CP='CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR'") //p3p响应头
  ctx.body = 'create Cookie ok'})
2.1.3 url参数实现跨域信息传递

访问http://www.c.com:3000/createToken?from=http://www.a.com/createCookie

www.c.com上生成token后将url重写,带上token,重定向到www.a.com

router.get('/createToken', async (ctx, next) => {
  let { from } = ctx.request.query  let token = "123";
  ctx.response.redirect(`${from}?token=${token}`)})

www.a.com上从url上获取token,存入cookie

router.get('/createCookie', async (ctx, next) => {
  let { token } = ctx.request.query
  ctx.cookies.set('token', token, {
    maxAge: 60 * 60 * 1000, //有效时间,单位毫秒
    httpOnly: false,
    path: '/',
  });
  ctx.body = 'set cookie ok'})

这样就实现了跨域信息的传递.与上面的方式不同,这种方法只是单纯的http请求,适用于所有浏览器,但是缺点也很明显,每次只能分享给一个服务器。
在这里插入图片描述

2.2 跨域读cookie
2.2.1 利用< script />标签跨域读cookie(jsonp)

之前2.1.1利用< script />标签在www.a.com中写入了www.c.com的cookie(username,123),现在想要www.a.com请求的时候携带上www.c.com的cookie,也就是说要跨域读cookie.

其实也是同样的方法,在www.a.com上利用< script />跨域访问访问www.c.com,会自动的带上domain为www.c.com的cookie。
www.a.com/index.js

<script src="https://www.c.com:3000/readCookie"></script>

www.c.com

router.get('/readCookie', async (ctx, next) => {
  let username = ctx.cookies.get('username')
  console.log('cookie', username)})

在这里插入图片描述
可以看到读取到了存储在www.a.com里面domain为www.c.com的cookie.

3. nodejs实现单点登录系统实战

在这里插入图片描述
效果如图所示:

  • 第一次访问www.a.com首页

  • 跳转到www.c.com:3000登录页面,登录成功后跳转www.a.com首页

  • 再次访问www.a.com首页,无需登录直接跳转

  • 访问www.b.com首页,无需登录直接跳转

源码: https://GitHub.com/wantao666/sso-nodejs

详细设计:
在这里插入图片描述

以上就是浅析node怎么实现单点登录系统的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 浅析node怎么实现单点登录系统

本文链接: https://lsjlt.com/news/173413.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 浅析node怎么实现单点登录系统
    一. 基础知识1.1 同源策略源 = 协议 + 域名 +端口以http://www.a.com为例:https://www.a.com ❌(协议不同)http://www.b.com ❌(域名不同)http://www.a.com:3000...
    99+
    2022-11-22
    nodejs node
  • node如何实现单点登录系统
    今天小编给大家分享一下node如何实现单点登录系统的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一. 基础知识1.1 同源策...
    99+
    2023-07-04
  • 浅析node是怎么实现github第三方登录的
    一、详细流程二、具体流程1.注册应用①登录github,Settings=>Developer settings=>OAuth Apps=>Register a new application ②填写应用信息③注册完成,得...
    99+
    2022-11-22
    nodejs​ node
  • 基于Node如何实现单点登录
    本文小编为大家详细介绍“基于Node如何实现单点登录”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于Node如何实现单点登录”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是单点登录随着公司业务的增多,必然...
    99+
    2023-07-04
  • nodejs如何实现单点登录系统
    这篇文章主要讲解了“nodejs如何实现单点登录系统”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs如何实现单点登录系统”吧!单点登录SSO(Single Sign On),就是把...
    99+
    2023-07-05
  • 什么是单点登录系统?用nodejs怎么实现?
    一. 基础知识1.1 同源策略源 = 协议 + 域名 +端口以http://www.a.com为例:https://www.a.com ❌(协议不同)http://www.b.com ❌(域名不同)http://www.a.com:3000...
    99+
    2023-05-14
    单点登录系统 nodejs node
  • 浅析node怎么实现ocr
    ocr即光学字符识别,简单的来说就是把图片上的文字识别出来。很遗憾我只是一个底层的web程序员,不咋会AI,要想实现ocr,只能找找第三方库了。python语言有很多ocr的第三方库,找了很久nodejs实现ocr的第三方库,最后发现了te...
    99+
    2022-11-22
    node nodejs
  • NodeJS怎么实现单点登录
    这篇文章主要讲解了“NodeJS怎么实现单点登录”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“NodeJS怎么实现单点登录”吧!什么是单点登录随着公司业务的增多,必然会产生各个不同的系统,如...
    99+
    2023-06-30
  • laravel单点登录怎么实现
    这篇“laravel单点登录怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“laravel单点登录怎么实现”文章吧。单...
    99+
    2023-07-02
  • SpringBoot单点登录怎么实现
    这篇文章主要介绍了SpringBoot单点登录怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot单点登录怎么实现文章都会有所收获,下面我们一起来看看吧。1.具体实现步骤添加拦截器,设置U...
    99+
    2023-07-04
  • Java spring单点登录系统
    目录1.单点登录系统介绍2.简单业务实现2.1添加依赖2.2 项目配置文件2.3添加项目启动类2.4 启动并访问项目3. 优化进一步设计3.1 定义安全配置类 SecurityCon...
    99+
    2024-04-02
  • 浅析node怎么进行微博第三方登录
    接入微博第三方登录可以免注册,对用户的体验更好,今天我们就用nodejs实现微博第三方登录(用其它语言也可以)。【相关教程推荐:nodejs视频教程】实现效果在线实例: http://www.lolmbbs.com/login1、点击微博登...
    99+
    2022-11-22
    node nodejs​ Node.js
  • 聊聊基于Node实现单点登录(SSO)的方法
    以上就是聊聊基于Node实现单点登录(SSO)的方法的详细内容,更多请关注编程网其它相关文章!...
    99+
    2023-05-14
    SSO 单点登录 node
  • NodeJS实现单点登录原理解析
    目录什么是单点登录单点登录原理NodeJS 演示三个不同的服务首次访问跳转至登录页应用A判断登录态,跳转到SSO认证服务器认证服务器判断登录态,渲染登录页校验用户信息,创建令牌从认证...
    99+
    2024-04-02
  • vue页面怎么实现单点登录
    在vue页面中实现单点登录的方法有:1.通过Cookie作为凭证媒介实现;2.通过页面重定向方式实现;3.通过JSONP实现;具体方法如下:通过Cookie作为凭证媒介实现单点登录可以在vue中利用cookie作为媒介,用于存放用户凭证,当...
    99+
    2024-04-02
  • PHP SSO单点登录实现原理解析
    随着互联网的发展,人们在使用各种网站和应用程序的过程中常常遇到需要重新登录的问题,这不仅浪费了用户的时间,也给用户带来了不便。为了解决这个问题,SSO(Single Sign-On)单点登录技术应运而生。一、SSO单点登录的概念SSO(Si...
    99+
    2023-10-21
    PHP SSO (单点登录) 实现原理解析
  • springbootoauth2实现单点登录实例
        我们见过的很多网站,容许使用第三方账号登录,他不需要关注用户信息,只需要用户拿到授权码就可以访问。     oauth2是用...
    99+
    2024-04-02
  • node如何实现简单的脚手架浅析
    脚手架的实现原理无外乎: 通过命令行交互询问用户问题 根据用户的答案生成相应的项目结构 脚手架很多,比如特定语言封装好的脚手架集成方案:react-app,vue-cli,还有通用的...
    99+
    2024-04-02
  • iframe嵌套页面单点登录怎么实现
    要实现iframe嵌套页面的单点登录,可以按照以下步骤进行:1. 在主页面中,使用一个iframe来嵌入需要进行单点登录的子页面。2...
    99+
    2023-08-08
    iframe
  • SpringSecurityOAuth2单点登录和登出的实现
    目录1. 单点登录1.1 使用内存保存客户端和用户信息1.2 使用数据库保存客户端和用户信息1.3 单点登录流程1.3 JWT Token2. 单点登出3. 总结参考:Spring ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作