基于oauth 2.0 实现第三方开放平台
本文单纯从简单的技术实现来讲,不涉及开放平台的多维度的运营理念。
什么是开放平台
通过开放自己平台产品服务的各种API接口,让其他第三方开发者在开发应用时根据需求直接调用,例如微信登录、QQ登录、微信支付、微博登录、热门等。
让第三方应用通过开发平台,使得自身海量数据资源得到沉淀(变现)
目前国内主流的网站的的开放平台,都是基于oauth2.0 协议进行做的开放平台
- 微信开放平台授权机制流程图
- 微博开放平台授权机制流程图
oauth2.0 授权码模式
授权码模式(authorization code)是功能最完整、流程最严密的授权模式。 它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动,能够满足绝大多数开放平台认证授权的需求。
引入相关依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-oauth2</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-security</artifactId> </dependency>
配置认证服务器
通过内存模式,初始化一个支持授权码模式的客户端
@Configuration @AllArgsConstructor @EnableAuthorizationServer public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { @Override @SneakyThrows public void configure(ClientDetailsServiceConfigurer clients) { clients.inMemory() .withClient("pigx") // client_id .secret("pigx") // client_secret .authorizedGrantTypes("authorization_code") // 该client允许的授权类型 .scopes("app"); // 允许的授权范围 } }
初步完成,测试一下
注意这里是 /oauth/authorize 不是 /oauth/token 接口,只需要带 client_id 即可。
localhost:9999/oauth/authorize?client_id=pigx&response_type=code&redirect_uri=https://pig4cloud.com
- 先进行basic 登录,默认用户user,密码已经打在控制台自己查即可
- 授权确认
- 登录成功带着code回调到目标接口
- 通过/oauth/token获取登录令牌
简单的几步就完成上图微信或者其他网站的授权流程,不过目前为止 略显简陋
- 登录没有界面,用户密码数据库没有保存
- 确认授权界面太丑,没有个性化
配置安全登录
- 配置未登录拦截重定向到 loginPage
- 配置登录完成提交的页面路径 这里会被spring security 接管
@Primary @Order(90) @Configuration public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter { @Override @SneakyThrows protected void configure(HttpSecurity http) { http .formLogin() .loginPage("/token/login") .loginProcessingUrl("/token/form") .and() .authorizeRequests() .anyRequest().authenticated(); } }
认证服务器配置用户加载规则实现
@Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) { endpoints.userDetailsService(pigxUserDetailsService) } // 通过这步去加载数据的用户名密码 public interface UserDetailsService { UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException; }
重写原有认证页面
默认逻辑/oauth/confirm_access,让他重定向到我们自己的路径,然后进行个性哈
@Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) { endpoints .userDetailsService(pigxUserDetailsService) .pathMapping("/oauth/confirm_access", "/token/confirm_access") }
获取上下文中的授权信息,传给前端
/** * 确认授权页面 * * @param request * @param session * @param modelAndView * @return */ @GetMapping("/confirm_access") public ModelAndView confirm(HttpServletRequest request, HttpSession session, ModelAndView modelAndView) { Map<String, Object> scopeList = (Map<String, Object>) request.getAttribute("scopes"); modelAndView.addObject("scopeList", scopeList.keySet()); Object auth = session.getAttribute("authorizationRequest"); if (auth != null) { AuthorizationRequest authorizationRequest = (AuthorizationRequest) auth; ClientDetails clientDetails = clientDetailsService.loadClientByClientId(authorizationRequest.getClientId()); modelAndView.addObject("app", clientDetails.getAdditionalInformation()); modelAndView.addObject("user", SecurityUtils.getUser()); } modelAndView.setViewName("ftl/confirm"); return modelAndView; }
最终效果
- 把用户头像等信息展示出来就蛮好看了
总结
- 以上源码参考个人项目 基于Spring Cloud、OAuth2.0开发基于Vue前后分离的开发平台
- QQ: 2270033969 一起来聊聊你们是咋用 spring cloud 的吧。
- 欢迎关注我们的公众号获得更多的好玩JavaEE 实践
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
『并发包入坑指北』之阻塞队列
前言 较长一段时间以来我都发现不少开发者对 jdk 中的 J.U.C(java.util.concurrent)也就是 Java 并发包的使用甚少,更别谈对它的理解了;但这却也是我们进阶的必备关卡。 之前或多或少也分享过相关内容,但都不成体系;于是便想整理一套与并发包相关的系列文章。 其中的内容主要包含以下几个部分: 根据定义自己实现一个并发工具。 JDK 的标准实现。 实践案例。 基于这三点我相信大家对这部分内容不至于一问三不知。 既然开了一个新坑,就不想做的太差;所以我打算将这个列表下的大部分类都讲到。 所以本次重点讨论 ArrayBlockingQueue。 自己实现 在自己实现之前先搞清楚阻塞队列的几个特点: 基本队列特性:先进先出。 写入队列空间不可用时会阻塞。 获取队列数据时当队列为空时将阻塞。 实现队列的方式多种,总的来说就是数组和链表;其实我们只需要搞清楚其中一个即可,不同的特性主要表现为数组和链表的区别。 这里的 ArrayBlockingQueue 看名字很明显是由数组实现。 我们先根据它这三个特性尝试自己实现试试。 初始化队列 我这里自定义了一个类:ArrayQu...
- 下一篇
从0到1使用Kubernetes系列(六):数据持久化实战
本文是从0到1使用Kubernetes系列第六篇,上一篇《从0到1使用Kubernetes系列(五):Kubernetes Scheduling》介绍了Kubernetes调度器如何进行资源调度,本文将为大家介绍几种常用储存类型。 默认情况下Pod挂载在磁盘上的文件生命周期与Pod生命周期是一致的,若Pod出现崩溃的情况,kubelet 将会重启它,这将会造成Pod中的文件将丢失,因为Pod会以镜像最初的状态重新启动。在实际应用当中,开发者有很多时候需要将容器中的数据保留下来,比如在Kubernetes中部署了MySql,不能因为MySql容器挂掉重启而上面的数据全部丢失;其次,在 Pod 中同时运行多个容器时,这些容器之间可能需要共享文件。也有的时候,开发者需要预置配置文件,使其在容器中生效,例如自定义了mysql.cnf文件在MySql启动时就需要加载此配置文件。这些都将是今天将要实战解决的问题。 今天这篇文将讲解下面几种常用存储类型: secret configMap emptyDir hostPath nfs persistentVolumeClaim SECRET Secre...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程