宝哥软件园

nodejs实现OAuth2.0授权服务认证

编辑:宝哥软件园 来源:互联网 时间:2021-09-01

OAuth是开发授权的网络标准,拼写为开放授权,最新协议版本为2.0。

举个栗子:

有一个“云打印”网站,可以打印用户在谷歌存储的照片。为了使用这项服务,用户必须让云打印阅读他们存储在谷歌上的照片。

传统上,用户告诉“云打印”他们的谷歌用户名和密码,后者可以读取他们的照片。这种方法有以下严重缺点。

云打印会为后续服务保存用户密码,非常不安全。谷歌必须部署密码登录,我们知道简单的密码登录是不安全的。云打印有权获得用户在谷歌存储的所有数据,用户不能限制云打印授权的范围和有效性。只有通过更改密码,用户才能收回赋予“云打印”的权力。但这样做会使用户授权的所有其他第三方应用程序失效。只要第三方应用被破解,就会导致用户密码泄露和所有密码保护的数据泄露。所以OAuth诞生了!

第三方应用程序:第三方应用程序,在本文中也称为“客户端”,即前面示例中的“云打印”。Httpservice: http服务提供者,在本文中称为‘服务提供者’,也就是前面例子中的Google。资源所有者:资源所有者,在本文中也称为“用户”。用户代理:用户代理,这里指的是浏览器。授权服务器:认证服务器,即服务提供商专门用来处理认证的服务器。资源服务器:资源服务器,即服务提供者存储用户生成的资源的服务器。它可以是相同的服务器,也可以不同于身份验证服务器。登录层提供令牌的生成,包括:有效期和权限范围。客户端获取令牌以访问受限资源。

Access_token:请求资源时要携带的令牌,即访问令牌。Refresh_token:刷新令牌。如果访问令牌过期,您可以使用此令牌获取新的访问令牌和刷新令牌。一般来说,refresh_token的时效性比较长,比如一年,而access_token的时效性比较短,比如几分钟。权限范围:指定客户端可以获取的资源权限范围。OAuth授权模式

OAuth有四种授权模式,即:

授权码、隐式密码、客户端凭证)1。授权代码

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

2.密码模式

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

用户向客户端提供用户名和密码。客户端向认证服务器发送用户名和密码,并向认证服务器请求令牌。认证服务器确认无误后,向客户端提供访问令牌。

3.刷新令牌的应用

refresh_token用于获取新的access_token和refresh_token,使用方法简单如下:

无效的刷新标记:

用nodejs实现OAuth授权服务

技术堆栈:

详情请参考:https://github.com/azard/egg-oauth2-serverhttps://cnodejs.org/topic/592b2aedba8670562a40f60b

1.代码授权模式测试和单点登录实现

这里我们构建了两个站点,一个是端口7001(授权服务),另一个是端口7002(客户端),授权模式是代码授予。

第一个是客户端登录页面:

单击按钮并直接登录:

可以发现,浏览器重定向到授权服务地址,并携带了响应类型、客户端身份证、重定向上呼吸道感染三个参数,登录成功后,浏览器会重定向到重定向上呼吸道感染指定的地址,即这里的* http://127 .0 .0 .1:7002/auth/redirect *:

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

表单操作='/oauth2/authorize?{ { query } } ' id=' form 1 ' name=' f ' method=' post ' div class=' input _ outer ' span class=' u _ user '/span input name=' username ' class=' text ' style=' color : # FFFFFF!重要信息type='text '占位符='请输入账户/div class=' input _ outer ' span class=' us _ uer '/span input name=' password ' class=' text ' style=' color : # FFFFFF!重要;位置:绝对;' z-index :100'值=' '类型='密码'占位符='请输入密码/div class=' mb2 ' a class=' act-但提交href=' javascript:'rel='外部no follow ' onclick='文档。getelementbyid('表单1 ').submit()' style=' color : # FFFFFF '登录/a/div/form这里的${query}即为客户端登录重定向携带的完整查询,然后是/oauth2/authorize路由的写法:

app.all('/oauth2/authorize ',app。oauth 2服务器。authorize());//获取授权码这里调用app.oAuth2Server.authorize()时,插件会自动执行重定向操作,首先是重定向到客户端指定地址,客户端拿到密码和状态后,再去授权层获取令牌:

异步重定向(){ //服务端重定向过来的控制台。日志(这个。CTX。查询)const result=等待此。CTX。curl(' http://127。0 .0 .1:7001/users/token ',{ dataType: 'json ',//内容类型: ' application/x-www-form-URL编码',//默认格式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,});这个。CTX。body=结果。数据;}获取到代币后正常返回:

2、密码授予模式测试

首先使用用户名、密码获取access_token:

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

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

以上内容完整源码参考:https://github。com/caiya/egg js-oauth 2-服务器

总结

OAuth实际使用时要上https,包括客户端和授权服务端授权服务可以使用私钥签名,客户端使用公钥验证,从而保证数据安全性以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

更多资讯
游戏推荐
更多+