OAuth 2 是一种授权协议,用于通过 HTTP 协议提供对受保护资源的访问。OAuth2 使第三方应用程序能够获得对资源的有限访问。资源的所有者告诉系统,同意授权第三方应用进入系统,获取对这些资源访问。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用。
由于授权的场景众多,OAuth 2.0 协议定义了获取令牌的四种授权方式,分别是:
四种授权模式分别使用不同的 grant_type 来区分
OAuth 定义了四个角色
访问令牌的职责是在数据过期之前访问数据。
刷新令牌的职责是在现有访问令牌过期时请求新的访问令牌。
要使用 spring security oauth2 模块创建授权服务器,我们需要使用注解@EnableAuthorizationServer 并扩展类 AuthorizationServerConfigurerAdapter。
Spring security oauth 公开了两个用于检查令牌的端点(/oauth/check_token 和 /oauth/token_key),默认它们在 denyAll() 之后受保护。 tokenKeyAccess() 和 checkTokenAccess() 方法打开这些端点以供使用。
ClientDetailsServiceConfigurer 用于定义客户端详细信息,可以基于内存或 JDBC 实现。 为了演示的简单,例子中使用内存实现。 它具有以下重要属性:
clientId –(必需)客户端 ID。
secret(密钥) -(受信任的客户端需要)客户端密钥,如果有的话。
scope – 客户端受限的范围。 如果范围未定义或为空(默认),则客户端不受范围限制。
authorizedGrantTypes – 授权客户端使用的授权类型。 默认值为空。
权限 - 授予客户端的权限(常规 Spring Security 权限)。
redirectUris – 将用户代理重定向到客户端的重定向url。 它必须是绝对 URL。
要创建资源服务器组件,需要使用 @EnableResourceServer 注释并扩展 ResourceServerConfigurerAdapter 类。
上面的配置在 /api 开始的所有端点上启用保护。 所有其他端点都可以自由访问。
资源服务器还提供了一种机制来验证用户本身。 在大多数情况下,它将是基于表单的登录。
上面的 WebSecurityConfigurerAdapter 类设置了一个基于表单的登录页面,并使用 permitAll() 打开授权 URL。
为了简化的目的,仅提供了一个简单的获取用户profile的服务,如下:
我们在浏览器中访问 http://localhost:8080/api/users/me ,会跳转到SpringBoot security提供的登录页面,输入用户名jack,密码123456就可以访问该api,但作为第三方应用程序,没有用户名和密码,只能通过OAuth2令牌来访问
如上面的流程图所示,第一步是从 URL 获取资源所有者的授权,如下的url
它将跳转到Springboot security提供的login页面,用户提供用户名和密码,我们的例子中提供用户名jack,密码123456
上一步获取到了授权码,下一步第三方应用程序将使用授权码来获取访问令牌。 可以使用curl命令来获取access token。
authorization中需要使用basic认证,提供用户名clientapp,密码123456,可以使用下面的网站来获取加密后的字符串
授权服务将返回如下的信息,包括access_token,refresh_token和token_type等。
获得访问令牌后,我们可以前往资源服务器获取受保护的API.使用curl命令来访问API,authorization是上一步获取到的access_token。
获取信息如下:
在第三方应用程序获取系统资源时,不在该平台输入用户名、密码便可登录。如在平台利用微信登录时并没有输入用户名、密码,会跳到微信平台输入微信密码,微信认证后,将用户信息提供给该平台,该平台利用此信息将用户在平台注册,如此用户虽然在微信端登录却能在平台保存信息,其中就用到了oauth2思想。
1.授权码:这是最安全的方式也是最推荐,完整的oauth2框架,真正oauth2框架要解决的问题的方案,其他方式都不是安全的
2.密码模式:不建议使用,如此会将用户用户名密码信息暴露在第三方平台上可能导致用户信息泄露,除非该平台是系统信任的平台。
3.简化模式:用户在浏览器向认证服务器申请令牌,跳过了“获取授权码”的步骤,不需要用户登录,返回的token可见,用户将此token给客户端,客户端携带去请求
4.用户在客户端注册,客户端以自己名义而不是用户名义向认证服务器申请访问令牌
swagger 文档在日常开发中,用得比较多,往往我们都是手动配置,swagger3.0之后,直接就上了一个swagger-starter,用起来更方便了。swagger3.0发生了很多变化,比如包名、注解、访问路径等都有所变化。具体自己去体会了,我就是不多说了,直接开干。
swagger3.0项目地址: https://github.com/springfox/springfox
1.一个springboot项目
2.swagger3.0依赖
1.在springboot项目pom中添加入swagger3.0依赖
2.在启动类上加新版注解@EnableOpenApi
3.添加一个接口测试controller:
4.直接启动搞定: 注意 访问路径 http://localhost:8080/swagger-ui/index.html ,和2不一样了。
再一运行:
ok了,就搞定了。
当使用https后界面上的services地址不会随着你的项目域名变https时自动变https,如下图:
当然,这个bug官方会在3.0.1版本中修复, https://github.com/springfox/springfox/issues/3468 ,目前也是可以解决这个问题的,自定义swagger拦截器,借鉴了 https://github.com/springfox/springfox/issues/3531 ,
此时再重新启动项目:
就可以正常了,当然这只是我自己处理的一个思路,具体实现可以各抒己见。
最后的最后:demo地址: https://gitee.com/zzj1992/swagger3-demo.git
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)