问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

nodejs rejectUnauthorized 是不是不需要认证服务端

发布网友 发布时间:2022-04-22 19:12

我来回答

2个回答

懂视网 时间:2022-04-22 23:33

本篇文章主要介绍了nodejs实现OAuth2.0授权服务认证,现在分享给大家,也给大家做个参考。

OAuth是一种开发授权的网络标准,全拼为open authorization,即开放式授权,最新的协议版本是2.0。

举个栗子:

有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来。用户为了使用该服务,必须让"云冲印"读取自己储存在Google上的照片。

传统方法是,用户将自己的Google用户名和密码,告诉"云冲印",后者就可以读取用户的照片了。这样的做法有以下几个严重的缺点。

  1. "云冲印"为了后续的服务,会保存用户的密码,这样很不安全。

  2. Google不得不部署密码登录,而我们知道,单纯的密码登录并不安全。

  3. "云冲印"拥有了获取用户储存在Google所有资料的权力,用户没法限制"云冲印"获得授权的范围和有效期。

  4. 用户只有修改密码,才能收回赋予"云冲印"的权力。但是这样做,会使得其他所有获得用户授权的第三方应用程序全部失效。

  5. 只要有一个第三方应用程序被破解,就会导致用户密码泄漏,以及所有被密码保护的数据泄漏。

所以OAuth就诞生了!

  1. Third-party application:第三方应用程序,本文中又称"客户端"(client),即上一节例子中的"云冲印"。

  2. HTTP service:HTTP服务提供商,本文中简称"服务提供商",即上一节例子中的Google。

  3. Resource Owner:资源所有者,本文中又称"用户"(user)。

  4. User Agent:用户代理,本文中就是指浏览器。

  5. Authorization server:认证服务器,即服务提供商专门用来处理认证的服务器。

  6. Resource server:资源服务器,即服务提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。

登录层提供令牌(token)的生成,其中token包括:有效期、权限范围。客户端拿到token去访问受限资源。

  1. access_token:请求资源时需要携带的token,即访问token。

  2. refresh_token:刷新token,如果access_token过期,可以使用该token获取一份新的access_token和新的refresh_token。一般refresh_token时效性较长,比如一年,而access_token时效性较短,比如几分钟。

  3. 权限范围:即指定客户端可以获取的资源权限范围。

OAuth授权模式

OAuth有四种授权模式,分别为:

  1. 授权码模式(authorization code)

  2. 简化模式(implicit)

  3. 密码模式(resource owner password credentials)

  4. 客户端模式(client credentials)

1、授权码模式

授权码模式是最为严密的授权模式,整体流程为:浏览器携带必要信息至授权页面,正常登录成功后,返回一个code(授权码),客户端拿到code后在后台获取拿code换取token。

2、密码模式

密码模式,简单地理解即为使用用户名密码等参数获取access_token,它的步骤如下:

  1. 用户向客户端提供用户名和密码。

  2. 客户端将用户名和密码发给认证服务器,向后者请求令牌。

  3. 认证服务器确认无误后,向客户端提供访问令牌。

3、refresh_token的应用

refresh_token被用来获取新的access_token和refresh_token,使用方式简单如下:

refresh_token无效:

使用nodejs实现OAuth授权服务

技术栈:

  1. nodejs + eggjs

  2. eggjs-oAuth-server插件

具体可以参考:
https://github.com/Azard/egg-oauth2-server
https://cnodejs.org/topic/592b2aedba8670562a40f60b

1、code grant模式测试及单点登录实现

这里我们构建两个站点,一个是7001端口(授权服务),一个是7002端口(客户端),授权模式为code grant。

首先是客户端登录页:

单击按钮后直接登录:

可以发现,浏览器重定向到授权服务地址,并携带了response_type、client_id、redirect_uri三个参数,登录成功后,浏览器会重定向到redirect_uri指定的地址,即这里的*http://127.0.0.1:7002/auth/redirect*:

如下为授权服务的登录页写法

<form action="/oauth2/authorize?{{query}}" id="form1" name="f" method="post">
 <p class="input_outer">
 <span class="u_user"></span>
 <input name="username" class="text" style="color: #FFFFFF !important" type="text" placeholder="请输入账户">
 </p>
 <p class="input_outer">
 <span class="us_uer"></span>
 <input name="password" class="text" style="color: #FFFFFF !important; position:absolute; z-index:100;"value="" type="password" placeholder="请输入密码">
 </p>
 <p class="mb2"><a class="act-but submit" href="javascript:;" rel="external nofollow" onclick="document.getElementById('form1').submit()" style="color: #FFFFFF">登录</a></p>
</form>

这里的${query}即为客户端登录重定向携带的完整query,然后是/oauth2/authorize路由的写法:

app.all('/oauth2/authorize', app.oAuth2Server.authorize());// 获取授权码

这里调用app.oAuth2Server.authorize()时,插件会自动执行重定向操作,首先是重定向到客户端指定地址,客户端拿到code和state后,再去授权层获取token:

async redirect(){
 // 服务端重定向过来的
 console.log(this.ctx.query)
 const result = await this.ctx.curl('http://127.0.0.1:7001/users/token', {
 dataType: 'json',
 // contentType: 'application/x-www-form-urlencoded', // 默认格式
 method: 'POST',
 timeout: 3000,
 data: {
 grant_type: 'authorization_code',
 code: this.ctx.query.code,
 state: this.ctx.query.state,
 client_id: client_id,
 client_secret: client_secret,
 redirect_uri: redirect_uri,
 }
 });
 this.ctx.body = result.data;
 }

获取到token后正常返回:

2、password grant模式测试

首先使用username、password获取access_token:

用户名或密码错误时返回:

使用token获取授权资源正常返回:

总结

  1. OAuth实际使用时要上https,包括客户端和授权服务端

  2. 授权服务可以使用私钥签名,客户端使用公钥验证,从而保证数据安全性

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

在nodejs+express环境中如何将搭建多人聊天室

在Vue+webpack中详细讲解基础配置

详细解读vue-admin和后端(flask)分离结合

热心网友 时间:2022-04-22 20:41

Nodejs就是为服务端而生的,说开了NodeJs只是JavaScript作为CommonJS的实现,使得JavaScript在服务器端有了用武之地,所以NodeJs从语法层面来说还是JavaScript。但是与客户端的JavaScript又有所区别。注意以下几点:
要学习NodeJs,必须有一定的JavaScript基础,理解事件模型,了解JavaScript的语法和特性,理解JavaScript面向对象编程
学习NodeJs类似于Python等代码组织的方式——包机制,require和exports。
一些基本的操作系统,HTTP等网络通信,数据库(尤其是非关系数据库),Web编程的知识有所了解。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
孤胆枪手怎么设置局域网啊、 我家小狗刚领来,没有名字,拜托大家起个名字。 护肤品代加工 水浒Q传跨服PK是怎么回事啊 新水浒Q传什么叫PK保护状态,上号不到一分钟就被打,求解 水浒Q传 为什么要pk有什么好处? 为什么贷款每次都审核失败 有谁能说一下手机贷审核不通过的原因吗?我都审核好多次了都不能通过... 贷款审核失败是什么原因 为什么贷款未通过审核 中国移动光纤宽带接收器装在家里有害吗? 移动宽带连接器上翻红灯为什么 本人2011年考研,数学基础还行,数学二的真题解析用哪本书比较好? 有什么有效的食疗可以减肥 有什么有用且健康的食疗减肥的方法吗? 有什么食疗的方法可以减肥呢? 2011考研数学二真题 三伏天后是减肥关键期,常用5类减肥食疗方法,没 韦尔股份宏观分析?韦尔股份原始股价?韦尔股份为啥一直涨? 半导体问题:请问芯片和分立器件是什么关系?分立器件和集成电路是什么关系? 半导体分立器件是干什么用的?那些东西要用它?比如? 基本面分析韦尔股份?韦尔股份财务报告分析?韦尔股份股票手机诊断? 上班时间怎么运动减肥 孕妇怎样减肥有效4大简单运动减肥方法推荐 怀孕可以做什么运动保持身材 哪些运动适合产妇运动减肥 nodejs程序里面怎么实现免密证书验证 二层猪皮和pu哪个好? qq申请成公众号会限流吗? 我把我qq变成了公众号还能和好友正常聊天吗? 移动安装宽带连接器多少钱包 苹果macbook pro 用 以太网连接器 连接 大学宿舍移动宽带网线 上网,显示无法接入互联网。 大连小辛寨子西沟有移动宽带连接器吗 我家移动宽带突然上不了网了,猫上面PON灯亮,LOS灯不亮,RUN灯一闪一闪的,LAN灯一直亮,这 移动百兆宽带光信号线断了可以象接电线那样接吗? WiFi的连接器上面的los那里一直闪红灯怎么回事? 我家装了移动宽带,本来装在客厅的,可以放到房间里吗 怎么让少儿里的配音演员认识我们 快餐店取什么名字`好记 响亮`` 河南18项措施支持房地产复工复产 延期纳税最长不超过3个月 博朗耳温枪start键下去弹不回来 博朗耳温枪4520 为什么测不准? 博朗耳温枪,两耳的温度差好多?怎么测才准确 博朗耳温枪为什么每次都要选年龄 大学中的学前教育专业要学高数么,大概都要学些什么呢,哪些是一定要学的 为什么女的胸部比男的大啊?? bilibili上有人未经本人允许私自发布含有别人照片的视频怎么办 手提电脑win7系统关不了机 华硕笔记本电脑win7旗舰版关不了机怎样解决? 谁帮我取一个最好听的外国人的名字,要中文显示的,谢谢!!!我急需