SpringBoot--实战开发--整合OAuth2.0(十五)

一、OAuth2.0简介

  OAuth2.0是OAuth协议的延续版本,但不向前兼容OAuth 2.0(即完全废止了OAuth1.0)。 OAuth 2.0关注客户端开发者的简易性。要么通过组织在资源拥有者和HTTP服务商之间的被批准的交互动作代表用户,要么允许第三方应用代表用户获得访问的权限。同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。
一个简单的例子来说明oauth是什么:
现在很多网站在登录时可以选择使用第三方账号登陆,比如这样:


CSDN第3方登录

你可以选择一个现有的账号来登了,比如GitHub。然后就会跳转到GitHub的登陆界面,要求你输入账号密码登陆GitHub:


github授权

github授权

一旦你同意授权之后,就可以自动跳转到博客,并且使用GitHub账号登陆博客。
这是一个典型的OAuth认证授权过程,在这个过程中,涉及到以下角色:
资源所有者:GitHub账号所有者,也就是我

第三方应用:CSDN博客服务
授权服务器:GitHub服务
资源服务器:GitHub服务,这里的授权服务器和资源服务器是同一个,但这并不是必须的
代理客户端:浏览器

  1. 整个认证授权过程中,你并没有向CSDN提供你的GitHub密码,而是在GitHub上为CSDN授予访问你在GitHub上的资源(Account、Public data)的访问权限。
  2. 你可以在所有支持GitHub账号登陆的网站上使用GitHub授权登陆,而这些第三方网站也可以根据你的授权范围访问你在GitHub上的资源。如果某天你不希望这些第三方网站中的一些继续访问你在GitHub上的资源,你可以移除对应的授权,同时不会对其他第三方网站产生影响。
访问流程

二、授权流程

OAuth2.0定义了四种授权许可类型,分别是:授权码、隐式许可、资源所有者密码凭据和客户端凭据。这里仅介绍授权码类型。授权码类型是功能最完整、流程最严密的授权模式,简化流程如下:


授权流程
  1. 用户通过浏览器访问互联网网站,比如CSDN
  2. 在浏览器输入CSDN地址,打开登陆节点,准备通过GitHub账号登陆
  3. CSDN给浏览器返回GitHub授权地址,授权地址参数范围:

response_type:必选项,常量 code
client_id:必选项,客户端注册时参数的客户端唯一标识符
redirect_uri:可选性,授权成功后的跳转地址
scope:可选项,授权范围,授权服务器定义的字符串常量,多个值使用空格分隔
state:推荐项,用于维护请求和回调之间的状态的不透明的值,可用于防止CSRF攻击

  1. 浏览器根据CSDN的响应内容,跳转到GitHub授权地址,完成:登陆、授权、返回

登陆:用户输入凭据登陆GitHub
授权:通常包括资源范围、有效时限等(比如:访问QQ空间、发布状态等)
返回:在上一步的redirect_uri上最佳code和state参数后返回浏览器
code:根据用户授权参数到授权码
state:上一步的state原样返回

  1. 浏览器根据GitHub的响应内容,跳转到CSDN服务端,跳转地址中包括code和state

CSDN服务端获取URL中的code,然后CSDN服务端访问GitHub服务端,请求参数范围:
grant_type:必选项,常量 authorization_code
code:必选项,GitHub返回的code
redirect_uri:必选项,必须和之前的redirect_uri完全一致
client_id:必选项,通常CSDN会和GitHub协商(注册),GitHub给CSDN一个唯一标识符
client_secret:可选项,GitHub以此来验证CSDN的真实性
GitHub服务端验证成功后响应CSDN服务端,响应内容包括:
access_token:必选项,授权服务器颁发的访问令牌,CSDN凭此访问资源
token_type:必选项,指令牌类型,大小写敏感
expires_in:推荐项,令牌有效期,单位:秒
refresh_token:必选项,access_token过期后从新获取新值时的凭据,access_token的有效期可能比expires_in短

  1. CSDN服务端使用access_token向资源服务器(这里还是GitHub)发出资源访问请求

资源服务器验证access_token是否合法(过期、超范围访问等),响应请求
CSDN向浏览器响应资源访问成功(这里是使用GitHub账号登陆成功,有可能还会获得用户头像等公开信息)

三、Maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>

四、客户端模式(Client Credentials)

客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。

(A)客户端向认证服务器进行身份认证,并要求一个访问令牌。
客户端发出的HTTP请求,包含以下参数:
granttype:表示授权类型,此处的值固定为"clientcredentials",必选项。
scope:表示权限范围,可选项。

     POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded
     grant_type=client_credentials

认证服务器必须以某种方式,验证客户端身份。
(B)认证服务器确认无误后,向客户端提供访问令牌。
认证服务器向客户端发送访问令牌。

     HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache

     {
       "access_token":"2YotnFZFEjr1zCsicMWpAA",
       "token_type":"example",
       "expires_in":3600,
       "example_parameter":"example_value"
     }
  1. 控制器
@RestController
@RequestMapping("/user")
public class UserController {
    @GetMapping
    public String getUser(){
        return "admin";
    }
}
  1. 访问测试
    登录用户(默认):user
    密码是程序启动时自动生成的一串字符串

密码

访问地址:http://localhost:8080/login
测试访问

结果

  1. 禁用安全设置或者设置对应的用户和密码
    可以在application.properteis中配置对应的用户和密码
    也可以设置对应的用户名和密码
spring.security.user.name=admin
spring.security.user.password=123456
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是三方授权? 第三方授权就是,委托第三方来对既定的用户进行鉴定,鉴定成功之后,下发信任凭证,信任凭证和用户挂钩...
    一只小哈阅读 32,815评论 2 21
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,167评论 1 32
  • OAuth2.0 是关于授权的开放网络标准,它允许用户已第三方应用获取该用户在某一网站的私密资源,而无需提供用户名...
    baiyi阅读 10,419评论 4 25
  • 装箱和拆箱是值类型和引用类型之间相互转换是要执行的操作。 1. 装箱在值类型向引用类型转换时发生 2. 拆箱在引用...
    派大星_5274阅读 1,040评论 0 0
  • 《如梦令 • 善待当下》 最近无闲露面,舞赛整天训练。 一日汗难干,哪懂台前无限。 如幻,如幻,梦见落花愁怨。 —...
    陈森霞笔名辰沐阅读 541评论 5 4