Spring Security OAuth 开发认证服务器

版权声明:个人原创 https://blog.csdn.net/qq_42459181/article/details/89633183

一、导学


1. 为什么要用Token代替session:

  开发繁琐:因为浏览器是天生支持 Cookie(JSESSION) 的,不需要写什么代码;而app想用Cookie(JSESSION),需要写大量代码来支持。
  安全性和客户体验差
  有些前端技术不支持Cookie:如微信小程序
在这里插入图片描述

2. Spring Security OAuth 简介:

  :我们要自己实现两个服务器,认证服务器和资源服务器。
在这里插入图片描述

二、实现 Authorization Server 授权码模式:


1. 通过 Authorization Server获取 授权码:

在这里插入图片描述
  :当我们完成上述配置启动工程,并访问 http://localhost:8080/oauth/authorize?response_type=code&client_id=xxx&redirect_uri=http://example.com&scope=all 时,遇到问题:org.springframework.security.authentication.InsufficientAuthenticationException: User must be authenticated with Spring Security before authorization can be completed.,经过DEBUG,发现走到AuthorizationEndpoint这个类的第142行,代码如下:
在这里插入图片描述
principal为null,经过分析,应该是在认证时过滤器链的问题,未经登录认证的用户直接访问 /oauth/authorize 并没有拿到principal,故要将 /oauth 保护起来,让用户先行登录,再访问 /oauth/authorize 便可解决问题。具体代码如下:
在这里插入图片描述
在这里插入图片描述
我们重新访问 http://localhost:8080/oauth/authorize?response_type=code&client_id=xxx&redirect_uri=http://example.com&scope=all 就会跳到登录页面:
在这里插入图片描述
  :登录用户root,就是储存在我们认证服务器的用户。

登录成功后跳到认证页面:
在这里插入图片描述
选择Approve,允许认证,会带着授权码 跳到我们自己定义的重定向地址 http://example.com (即第三方应用),如图授权码hbMcyd,页面如下:
在这里插入图片描述

  请求参数分析:
    1.response_type: 返回类型,此处为返回授权码,所以是code。
    2.client_id: 客户端id,因为我们实现的是认证服务器,所以当用户登录的时候,我们需要知道第三方应用是谁?(微信、QQ、微博等) ,这个client_id就是第三方应用的标识。
    3.scope:由服务提供商自己定义的,可以随便定义各种字符串,满足个性化配置。

2. 通过授权码 获取 Token:

  第一步: 申请Token 的接口 http://localhost:8080/oauth/token 需要通过POST方式访问(故采用工具Postman)。
  第二步: 设置请求头参数 Authorization,通过Postman的小工具可以方便设置,如下图:
在这里插入图片描述
  :此处的请求方式选择Basic Auth,Username就是client_id,Password就是client_secret,如下图:
在这里插入图片描述
  第三步:设置请求体参数,如下图:
在这里插入图片描述
  :此处的code就是之前拿到的授权码。
  第四步:返回体,拿到了Token,如下图:
在这里插入图片描述

三、实现 Authorization Server 密码模式:

1. 说明:

  此种模式适用于第三方应用和服务提供商是信赖关系的情况下(同一家公司),因为这种模式用户会把自己在服务提供商保存的用户名和密码交给第三方应用处理,第三方应用会拿着用户的用户名和密码去访问服务提供商申请Token。如果第三方应用和服务提供商不是信赖关系(不是同一家公司),就不推荐采用这种方式。
具体操作如下

  第一步: 申请Token 的接口 http://localhost:8080/oauth/token 需要通过POST方式访问(故采用工具Postman)。
  第二步: 设置请求头参数 Authorization,通过Postman的小工具可以方便设置,如下图:
在这里插入图片描述
  :此处的请求方式选择Basic Auth,Username就是client_id,Password就是client_secret,如下图:
在这里插入图片描述
  :前两步和授权码模式相同,区别在于第三步的请求参数。

  第三步:设置请求体参数,如下图:
在这里插入图片描述
  第四步:返回体,拿到了Token,如下图:
在这里插入图片描述
  :不管是授权码模式还是密码模式,只要是同一个用户(此处为root),拿到的Token相同。

四、实现 Resource Server (资源服务器):

1. 说明:

  服务提供商提供两个服务器:认证服务器和资源服务器,在概念上是两个服务器,但是在物理上可以在一台机器上。

  第一步:配置 ResourceConfig,代码如下:
在这里插入图片描述
  第二步:当我们配置了资源服务器的时候,想要访问接口 http://localhost:8080/me 时,就需要拿着Token访问,不然是访问不到的。访问方式如下:
在这里插入图片描述
  第三步:访问成功,返回体如下:
在这里插入图片描述

五、自定义认证 :

1. 获取Token 流程:

在这里插入图片描述
  绿色是类,蓝色是接口(括号内为接口的实现类)。

猜你喜欢

转载自blog.csdn.net/qq_42459181/article/details/89633183