OAuth2密码模式已死,最先进的SpringCloud认证授权方案来了。许多学生都在寻找新的解决方案,有些甚至迷恋密码模式。胖哥也写了一篇文章来解决这个问题。看来还是不够。今天看到这篇文章的同学有福了,到这里问题就解决了。解决方案目前这应该是Spring生态中最新的解决方案,没有之一。我们先看看流程。其他与微服务无关的组件在此屏蔽,图中剩余组件:详细流程为:①用户向网关请求登录或通过网关向资源服务器请求资源。②网关根据OAuth2授权码发现用户无权发起OIDC流程,向授权服务器IdServer发起授权请求。③授权服务器IdServer收到授权请求,重定向到用户登录页面请求用户登录认证,发起授权。④用户输入用户名和密码进行登录验证。⑤IdServer授权服务器处理用户认证,重定向到网关同意的OAuth2RedirectURI。该流程属于标准的OIDC授权码流程。⑥网关获取AccessToken和IdToken:如果初始发起是登录,重定向到/。如果初始请求是针对资源服务器资源的,则令牌中继会重定向到相应的资源。资源服务器通过⑦⑧两个链接响应用户的请求。请注意,上述过程中生成的AccessToken和IdToken不允许提供给用户端,否则会造成中间人攻击。默认情况下提供了cookie策略,这在大多数情况下就足够了。如果你需要自定义它,你必须深入了解它的机制,你可以通过我的SpringSecurityOAuth2专栏来学习它。具体实现根据上面的方案,我们需要三个应用,分别是网关SpringCloudGateway应用、资源服务器应用ResourceServer和OAuth2授权服务器IdServer。SpringCloudGatewaySpringCloudGateway应用,8080端口,它既是一个网关也是一个OAuth2客户端,注册了授权服务器IdServer,通过IdServer可以在一分钟内完成配置。它需要将路由规则和令牌中继功能配置到资源服务器。核心配置是:spring:application:name:gatewaysecurity:oauth2:client:registration:#这里是客户端名称,可以自己改gatewayclient:client-id:e4da4a32-592b-46f0-ae1d-784310e88423#password是客户端注册时的密码client-secret:secret#redirect-uri只能选择一个:http://127.0.0.1:8080/login/oauth2/code/gatewayclient#另外两个方法是refresh_token,client_credentialsauthorization-grant-type:authorization_codeclient-authentication-method:client_secret_basicscope:message.write,userinfo,message.read,openidprovider:gatewayclient:#保证授权服务器地址可以被客户端访问issuer-uri:http://localhost:9000cloud:gateway:routes:-id:resource-serveruri:http://127.0.0.1:8084predicates:-Path=/res/**filters:-TokenRelayResourceServer资源服务器是服务器的我们平时写的业务接口,这里定义端口为8084,需要集成SpringSecurity及其ResourceServer组件负责定义资源接口的访问权限,例如://只有message.read才有资格访问资源/res/foohttpSecurity.authorizeRequests().antMatchers("/res/福”)。hasAnyAuthority("SCOPE_message.read")另外还需要与授权服务器IdServer通信,获取AccessToken的解码公钥:spring:security:oauth2:resourceserver:jwt:jwk-set-uri:http://localhost:9000/oauth2/jwks获取解码公钥的原理在我的SpringSecurityOAuth2专栏中有详细介绍,这里不再赘述。IdServer仓库地址:https://github.com/NotFound40...欢迎star,欢迎投稿。IdServer是一个基于SpringAuthorizationServer的开源授权服务器。大大降低了OAuth2授权服务器的学习和使用难度。提供UI控制台,动态权限控制,方便OAuth2客户端管理。可以一键生成SpringSecurity配置并开箱。即用型,少量配置即可部署,代码开源,方便二次开发,支持四种OAuth2客户端认证方式和三种授权模式。它是当前Spring安全生态的重要组成部分,也是未来的技术发展趋势。更多内容请参考IdServer项目仓库介绍。IdServer在本文中扮演OAuth2授权服务器的角色,负责处理授权请求,维护客户端注册信息,授权用户信息,后续会增加IDP支持。各种第三方登录用户也可以在这里动态登录。就像这样:根据业务需要,第三方OAuth2授权登录也可以优雅接入。当然access的登录方式需要OIDC或者OAuth2的支持。DEMO以及上面完整DEMO的使用方法在idserver仓库samples下。使用方法:拉取IdServer项目,加载依赖。在IntelliJIDEA中,右键samples文件夹下所有项目的pom.xml,在右键菜单中选择AddAsMavenProject。这一步非常重要。依次启动IdServer、gateway、resource-server三个项目。测试登录浏览器访问http://127.0.0.1:8080/login,点击http://localhost:9000。输入用户名和密码用户/用户。能够查看认证信息证明成功。同样,这些信息在生产中非常敏感,不应该直接暴露给前端。浏览器访问http://127.0.0.1:8080/res/foo来访问资源服务器的资源。另一个测试是关闭浏览器并重新打开它。浏览器访问http://127.0.0.1:8080/res/foo,看看会发生什么?总结通过OAuth2客户端、SpringCloudGateway、OAuth2授权服务器、OAuth2资源服务器的联动,你会发现授权码方式也可以实现完整的微服务认证授权,而且比密码方式更安全。IdServer实现联合登录后,也可以无缝集成其他第三方登录。多多关注,更高级的黑科技等着你。关注公众号:Felordcn获取更多资讯个人博客:https://felord.cn
