首页 > 其他分享 >OAuth2.0登录的四种方式

OAuth2.0登录的四种方式

时间:2024-07-09 17:51:55浏览次数:11  
标签:令牌 登录 网站 token client 跳转 授权 OAuth2.0 四种

OAuth登录的四种方式

1. 授权码

授权码(authorization code)方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌。

这种方式是最常用的流程,安全性也最高,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。

例如,有一个网站A(高德地图),需要向网站B(微博)授权登录

1705567996465.png

第一步,拿到授权码

A 网站(高德)提供一个链接,用户点击后就会跳转到 B(微博) 网站,授权用户数据给 A(高德) 网站使用。下面就是 A (高德)网站跳转 B (微博)网站的一个示意链接。

https://api.weibo.com/oauth2/authorize?
client_id=884965267
&redirect_uri=https%3A%2F%2Fid.amap.com%2Findex%2Fweibo%3Fpassport%3D1

client_id客户端id,redirect_uri跳转链接

第二步,在用户跳转后,B 网站会要求用户登录,然后询问是否同意给予 A(高德) 网站授权。用户表示同意,这时 B (微博)网站就会跳回redirect_uri参数指定的网址。

1705568068369.png

跳转时,会传回一个授权码,就像下面这样。

https%3A%2F%2Fid.amap.com%2Findex%2Fweibo%3Fpassport%3D1?
code=******

第三步,A (高德)网站拿到授权码以后,就可以在后端,向 B (微博)网站请求令牌。

https://api.weibo.com/oauth2/token?
 client_id=CLIENT_ID&
 client_secret=CLIENT_SECRET&
 grant_type=authorization_code&
 code=AUTHORIZATION_CODE&
 redirect_uri=CALLBACK_URL

上面的url中,client_id参数和client_secret参数用来让 B(微博) 确认 A(高德) 的身份(client_secret参数是保密的,因此只能在后端发请求),grant_type参数的值是AUTHORIZATION_CODE,表示采用的授权方式是授权码,code参数是上一步拿到的授权码,redirect_uri参数是令牌颁发后的回调网址。

第四步,B(微博) 网站收到请求以后,就会颁发令牌。具体做法是向redirect_uri指定的网址,发送一段 JSON 数据。

例如:


    {    
      "access_token":"ACCESS_TOKEN",
      "token_type":"bearer",
      "expires_in":2592000,
      "refresh_token":"REFRESH_TOKEN",
      "scope":"read",
      "uid":100101,
      "info":{...}
    }

access_token就是我们所需要的令牌,这个信息在A(高德)网站的后端得到,即可进行用户的登录认证

因此,这种方式的登录模式图为:1705568104946.png

这种登录一般应用于前后端分离登录,安全性非常的高,使用也是最广泛的一种

2. 隐藏式

有些 Web 应用是纯前端应用,没有后端。这时就不能用上面的方式了,必须将令牌储存在前端。RFC 6749 就规定了第二种方式,允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤,所以称为(授权码)"隐藏式"(implicit)。

第一步:A 网站提供一个链接,要求用户跳转到 B 网站,授权用户数据给 A 网站使用。

https://b.com/oauth/authorize?
  response_type=token&
  client_id=CLIENT_ID&
  redirect_uri=CALLBACK_URL&
  scope=read

上面 URL 中,response_type参数为token,表示要求直接返回令牌。

第二步:用户跳转到 B 网站,登录后同意给予 A 网站授权。这时,B 网站就会跳回redirect_uri参数指定的跳转网址,并且把令牌作为 URL 参数,传给 A 网站。

https://a.com/callback#token=ACCESS_TOKEN

上面 URL 中,token参数就是令牌,A 网站因此直接在前端拿到令牌。

1705568127815.png

这种方式的相对于上一种方式,更加简单,但是也更加不安全,所有的代码和登录都写在前端页面中,容易被他人破解,所以一般用于安全性不高的地方。

3. 密码式

如果你高度信任某个应用,RFC 6749 也允许用户把用户名和密码,直接告诉该应用。该应用就使用你的密码,申请令牌,这种方式称为"密码式"(password)。

第一步,A 网站要求用户提供 B 网站的用户名和密码。拿到以后,A 就直接向 B 请求令牌。(后端调用该接口)

https://oauth.b.com/token?
  grant_type=password&
  username=USERNAME&
  password=PASSWORD&
  client_id=CLIENT_ID

上面 URL 中,grant_type参数是授权方式,这里的password表示"密码式",usernamepassword是 B 的用户名和密码。

第二步,B 网站验证身份通过后,直接给出令牌。注意,这时不需要跳转,而是把令牌放在 JSON 数据里面,作为 HTTP 回应,A 因此拿到令牌。

这种方式风险很大,需要直接提供账号密码,所以只适用于其他授权方式都无法采用的情况,而且必须是用户高度信任的应用。

4. 凭证式

最后一种方式是凭证式(client credentials),适用于没有前端的命令行应用,即在命令行下请求令牌。

第一步,A 应用在命令行向 B 发出请求。

https://oauth.b.com/token?
  grant_type=client_credentials&
  client_id=CLIENT_ID&
  client_secret=CLIENT_SECRET

上面 URL 中,grant_type参数等于client_credentials表示采用凭证式,client_idclient_secret用来让 B 确认 A 的身份。

第二步,B 网站验证通过以后,直接返回令牌。

这种方式给出的令牌,是针对第三方应用的,而不是针对用户的,即有可能多个用户共享同一个令牌。

这种认证场景通常用于调用第三方接口,例如调用阿里云的短信接口等等

文章参考OAuth 2.0 的四种方式

标签:令牌,登录,网站,token,client,跳转,授权,OAuth2.0,四种
From: https://www.cnblogs.com/booleandev/p/18292471/the-four-ways-of-lauth20-login-zfhfhx

相关文章

  • linux学习之登录密码(ssh/telnet)
    在Linux系统中,用户登录密码是用于安全验证用户身份的一种方式。登录密码通常是加密后存储在系统的/etc/shadow文件中。如果您想要获取Linux系统中用户的登录密码,这通常是不可能的,因为密码是经过加密处理的,而且出于安全考虑,没有直接的方式可以获取它们的明文形式。/etc/passwd......
  • redis学习(007 实战:黑马点评:登录)
    黑马程序员Redis入门到实战教程,深度透析redis底层原理+redis分布式锁+企业解决方案+黑马点评实战项目总时长42:48:00共175P此文章包含第25p-第p34的内容文章目录短信登录功能session共享问题短信登录功能接口编写这里是Result的封装过滤器在......
  • SSO UAA 单点登录
    作为SpringCloud中的一员,SpringCloudSecurity是对微服务架构中所面临的安全性问题进行抽象并实现的工具。SpringCloudSecurity具备以下特点:基于OAuth2和OpenID协议的可配置的SSO登录机制,基于Token保障资源访问安全,另外,引入UAA(UserAccountandAuthentication,用户账户和认......
  • 修改metabase的cookies时长和Session时长及登录限制
    修改metabase的cookies时长和Session时长及登录限制  Cookiesmetabase-0.31.2\frontend\src\metabase\lib\cookies.js  14行 原值14改为1/2单位天 Sessionmetabase-0.31.2\src\metabase\config.clj  27行原值20160改为720单位分钟 多次登录限制metab......
  • oracle登录常见问题
    常见问题问题一:bash:sqlplus:commandnotfound...sqlplus/assysdba 解决方法:出现这个情况就是环境变量没有设置好, 重新设置环境变量就可以了, 使用 su-l oracle 就没问题(每次重启服务器都要导入一遍) 问题一:用户名密码不对解决方法:切换为oracle用户......
  • CSS四种定位介绍——相对定位、绝对定位、固定定位、粘性定位
    一、相对定位  1. 如何设置相对定位?   (1)给元素设置position:relative即可实现相对定位。   (2)可以使用left、right、top、bottom四个属性调整位置。  2. 相对定位的参考点?    相对自己原来的位置  3. 相对定位的特点:  ......
  • mac升级系统后ssh登录服务器问题
    报错信息:Unabletonegotiatewith111.111.113.86port123:nomatchinghostkeytypefound.Theiroffer:ssh-rsa分析:原因是MacosVentura13.0升级了ssh到9.0,ssl到3.3.6,而服务器上的sshd还是老版本;服务器上的老版本ssh和ssl无法和mac上的新版本ssh和ssl交互,新版本ss......
  • Windows服务器系统远程桌面设置多用户同时登录设置方法
    在实际使用我们较多使用的都是windows系统的单用户模式,它意味着当我们登录一个用户的时候如果另外一个用户也在登录,那么就得等待另外一个用户退出后或者强制踢出当前用户,才可以登录我们这个用户,下面大家可以参考下面的文章设置一下 在实际使用我们较多使用的都是windows系......
  • nodejs编写退出登录的接口逻辑
    目录1.安装必要的依赖2.登录成功生成和返回JWT3.在服务器端维护一个黑名单列表,记录已失效的JWT4.在验证JWT时检查黑名单5.退出登录时将JWT添加到黑名单中完整代码nodejs实现退出登录接口的逻辑,通常包括以下步骤:安装必要的依赖登录成功生成和返回JWT。在服务器......
  • nodejs登录成功生成token并验证
    目录1.安装必要的依赖包2.创建Express应用3.生成token4.使用`express-jwt`验证Token5.错误处理在Node.js中,nodejs登录成功生成token并验证通常涉及以下几个步骤:安装必要的依赖包:常用的库包括 `express`用于创建服务器,`jsonwebtoken`用于处理JWT(JSONWebToken),`expr......