一、OAuth2.0简介
OAuth2.0是OAuth协议的延续版本,但不向前兼容OAuth 2.0(即完全废止了OAuth1.0)。 OAuth 2.0关注客户端开发者的简易性。要么通过组织在资源拥有者和HTTP服务商之间的被批准的交互动作代表用户,要么允许第三方应用代表用户获得访问的权限。同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。
一个简单的例子来说明oauth是什么:
现在很多网站在登录时可以选择使用第三方账号登陆,比如这样:
你可以选择一个现有的账号来登了,比如GitHub。然后就会跳转到GitHub的登陆界面,要求你输入账号密码登陆GitHub:
一旦你同意授权之后,就可以自动跳转到博客,并且使用GitHub账号登陆博客。
这是一个典型的OAuth认证授权过程,在这个过程中,涉及到以下角色:
资源所有者:GitHub账号所有者,也就是我
第三方应用:CSDN博客服务
授权服务器:GitHub服务
资源服务器:GitHub服务,这里的授权服务器和资源服务器是同一个,但这并不是必须的
代理客户端:浏览器
二、授权流程
OAuth2.0定义了四种授权许可类型,分别是:授权码、隐式许可、资源所有者密码凭据和客户端凭据。这里仅介绍授权码类型。授权码类型是功能最完整、流程最严密的授权模式,简化流程如下:
- 用户通过浏览器访问互联网网站,比如CSDN
- 在浏览器输入CSDN地址,打开登陆节点,准备通过GitHub账号登陆
- CSDN给浏览器返回GitHub授权地址,授权地址参数范围:
- 浏览器根据CSDN的响应内容,跳转到GitHub授权地址,完成:登陆、授权、返回
- 浏览器根据GitHub的响应内容,跳转到CSDN服务端,跳转地址中包括code和state
- CSDN服务端使用access_token向资源服务器(这里还是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框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
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"
}
- 控制器
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping
public String getUser(){
return "admin";
}
}
- 访问测试
登录用户(默认):user
密码是程序启动时自动生成的一串字符串
访问地址:http://localhost:8080/login
- 禁用安全设置或者设置对应的用户和密码
可以在application.properteis中配置对应的用户和密码
也可以设置对应的用户名和密码
spring.security.user.name=admin
spring.security.user.password=123456