封面图片

微服务

SpringCloud微服务开发(二):认识Spring Security OAuth2

微服务体系一般由服务注册发现中心、网关、资源服务和认证服务这几个部分组成。这是微服务系列的第二篇,认识Spring Security OAuth2。


概念入门

授权服务的搭建基于Spring Security OAuth2。Spring基于OAuth2.0协议在Security中进行了实现,就是OAuth2。

  1. OAuth2可以满足第三方应用通过提供了OAuth2.0协议的公共服务提供商,比如google,github,qq等进行认证登录。
  2. OAuth2对于客户端认证提供如下支持:授权码模式(authorization_code)、客户端模式(client_credentials)、密码模式(password)、令牌刷新(refresh_token)。

在使用这几种方式前,都需要注册一个客户端,包含client_id和client_secret和客户端的认证方式,可以多个。

  • 最简单的密码模式就是通过提供用户名和密码来获取token进行认证。一般情况下适合自有客户端开发,比如vue,react前端方式使用。
  • 客户端模式是首先需要注册一个客户端,这个客户端包含client_id和client_secret。通过client_id和client_secret来获取token,再携带token去请求资源。一般应用在后端对后端访问时的认证。
  • 授权码模式最复杂,在注册客户端时,需要提交跳转的url。在认证服务器认证通过后,会跳转到该url,并携带一个code,客户端再通过code、client_id和client_secret来获取资源访问令牌(token)。使用场景就比如,很多网站可以通过微信、google等进行登录就是使用的这种方式。

认证流程大致如下:

https://ppsummer.com/blog/preview/078A6FACflow.png

案例

Spring Security OAuth2默认提供的四个URL

  • /oauth/authorize : 授权AuthorizationEndpoint
  • /oauth/token : 令牌TokenEndpoint
  • /oauth/check_token : 令牌校验CheckTokenEndpoint
  • /oauth/confirm_access : 授权页面WhitelabelApprovalEndpoint

密码模式

https://ppsummer.com/blog/preview/DDD80E18password1.png

刷新令牌

https://ppsummer.com/blog/preview/102AD335refreshtoken.png

授权码模式

浏览器输入请求code地址:

http://localhost:9092/oauth/authorize?response_type=code&client_id=c1&redirect_uri=http://www.baidu.com

跳出登录界面,输入用户名密码进行登录。

https://ppsummer.com/blog/preview/98334BF5signin.png

登录成功后跳转到指定页面并携带code。

https://ppsummer.com/blog/preview/10E0D816redirect.png

根据code在调用请求token接口获取token,如图:

https://ppsummer.com/blog/preview/0A43585Ccodetype.png

code存在数据库中,有有效期,不管是使用code获取令牌还是过期,该code都会从数据库中删除。

https://ppsummer.com/blog/preview/526D675Ecode.png

客户端模式

https://ppsummer.com/blog/preview/E94A3C49client.png

客户端模式需要提交三个参数,如图。返回结果中不包含refreshToken,token失效后需要重新调用该接口获取新的token。

表oauth_client_detail字段说明

https://ppsummer.com/blog/preview/D3FF8ED7table.png

建表语句,不是必须全部需要,根据需要选择。也可以根据实际需要在原有表字段的基础上添加新的字段。

spring-security-oauth/schema.sql at main · spring-attic/spring-security-oauth

1-- used in tests that use HSQL 2create table oauth_client_details ( 3 client_id VARCHAR(256) PRIMARY KEY, 4 resource_ids VARCHAR(256), 5 client_secret VARCHAR(256), 6 scope VARCHAR(256), 7 authorized_grant_types VARCHAR(256), 8 web_server_redirect_uri VARCHAR(256), 9 authorities VARCHAR(256), 10 access_token_validity INTEGER, 11 refresh_token_validity INTEGER, 12 additional_information VARCHAR(4096), 13 autoapprove VARCHAR(256) 14); 15 16create table oauth_client_token ( 17 token_id VARCHAR(256), 18 token LONGVARBINARY, 19 authentication_id VARCHAR(256) PRIMARY KEY, 20 user_name VARCHAR(256), 21 client_id VARCHAR(256) 22); 23 24create table oauth_access_token ( 25 token_id VARCHAR(256), 26 token LONGVARBINARY, 27 authentication_id VARCHAR(256) PRIMARY KEY, 28 user_name VARCHAR(256), 29 client_id VARCHAR(256), 30 authentication LONGVARBINARY, 31 refresh_token VARCHAR(256) 32); 33 34create table oauth_refresh_token ( 35 token_id VARCHAR(256), 36 token LONGVARBINARY, 37 authentication LONGVARBINARY 38); 39 40create table oauth_code ( 41 code VARCHAR(256), authentication LONGVARBINARY 42); 43 44create table oauth_approvals ( 45 userId VARCHAR(256), 46 clientId VARCHAR(256), 47 scope VARCHAR(256), 48 status VARCHAR(10), 49 expiresAt TIMESTAMP, 50 lastModifiedAt TIMESTAMP 51); 52 53-- customized oauth_client_details table 54create table ClientDetails ( 55 appId VARCHAR(256) PRIMARY KEY, 56 resourceIds VARCHAR(256), 57 appSecret VARCHAR(256), 58 scope VARCHAR(256), 59 grantTypes VARCHAR(256), 60 redirectUrl VARCHAR(256), 61 authorities VARCHAR(256), 62 access_token_validity INTEGER, 63 refresh_token_validity INTEGER, 64 additionalInformation VARCHAR(4096), 65 autoApproveScopes VARCHAR(256) 66);
2023年04月19日

更多文章

在初学者眼中,世界充满了可能;专家眼中,世界大都已经既定。--铃木俊隆