前言

这里作为自己的笔记记录,建议大家看 王松(江南一点雨) 的文章,已经对OAuth讲得很详细了,链接见下

Oauth2合集

同时,松哥也写了很多从实战到源码解析的文章如spring-security,spring源码解析等,可以在他的网站上查看,还有付费的视频课程,写得是真好!
自有网站https://www.javaboy.org/
CSDNhttps://wangsong.blog.csdn.net/
博客园https://www.cnblogs.com/lenve
稀土掘金https://juejin.cn/user/4441682704609320

Oauth2模式

  • 授权码模式 code 针对用户和客户端双双授权
  • 简化模式 token 直接返回token,不需要后端参与,一般纯静态页面
  • 密码模式 password 在客户端输入账号密码,需要高度信任客户端
  • 客户端模式 client_credential 针对应用的授权,没有用户的参与

授权码模式

用户、客户端均授权
授权码模式:常见的第三方平台登录功能基本都是使用这种模式。
两次请求获取token

  1. 请求验证获取code
    请求中类型:response_type=code

    1
    http://localhost:8080/oauth/authorize?client_id=client&response_type=code&scope=all&redirect_uri=http://localhost:8082/authCallback
  2. 请求验证获取token

    1
    2
    3
    4
    5
    6
    7
    8
    9
    MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
    map.add("code", code);
    map.add("client_id", "client");
    map.add("client_secret", "123");
    map.add("redirect_uri", "http://localhost:8082/authCallback");
    map.add("grant_type", "authorization_code");
    //发送请求获取token
    Map<String, String> resp = restTemplate.postForObject("http://localhost:8080/oauth/token", map, Map.class);
    String access_token = resp.get("access_token");
  3. 访问资源服务器

    1
    2
    3
    4
    5
    6
    7
    // 组装请求头
    HttpHeaders headers = new HttpHeaders();
    headers.add("Authorization", "Bearer " + access_token);
    HttpEntity<Object> httpEntity = new HttpEntity<>(headers);
    //请求资源服务器
    ResponseEntity<String> entity = restTemplate.exchange("http://localhost:8081/hello", HttpMethod.GET, httpEntity, String.class);
    System.out.println("hello 资源返回"+entity.getBody());

此种模式客户端和资源服务器都需要在授权服务器中注册

简化模式

简化授权码模式,没有中间code,直接一次请求获取到token
简化模式是不需要客户端服务器参与,直接在浏览器中向授权服务器申请令牌(token),一般如果网站是纯静态页面则可以采用这种方式。

请求中类型 response_type=token

1
https://wx.qq.com/oauth/authorize?response_type=token&client_id=javaboy&redirect_uri=www.javaboy.org&scope=all

返回即得到token,由于保存在前端,因此有安全问题

密码模式

输入用户账号密码获取授权
密码模式是用户把用户名密码直接告诉客户端,客户端使用这些信息向授权服务器申请令牌(token)。这需要用户对客户端高度信任,例如客户端应用和服务提供商就是同一家公司,我们自己做前后端分离登录就可以采用这种模式。

请求中类型response_type=password

1
https://wx.qq.com/oauth/authorize?response_type=password&client_id=javaboy&username=江南一点雨&password=123

请求可以放在客户端,也可以放在前端,因此存放的需要高度信任

客户端模式

只是验证客户端是否合法,与用户无关
客户端模式是指客户端使用自己的名义而不是用户的名义向服务提供者申请授权,严格来说,客户端模式并不能算作 OAuth 协议要解决的问题的一种解决方案,但是,对于开发者而言,在一些前后端分离应用或者为移动端提供的认证授权服务器上使用这种模式还是非常方便的。

请求中类型 grant_type=client_credential

1
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&client_id=APPID&client_secret=APPSECRET