当前位置: 首页 > Web前端 > HTML5

基于oauth2.0实现第三方开放平台

时间:2023-04-05 21:49:16 HTML5

本文纯粹从简单的技术实现角度出发,不涉及开放平台的多维运营理念。什么是开放平台?通过开放自有平台产品和服务的各种API接口,其他第三方开发者在开发应用时可以根据需要直接调用,如微信登录、QQ登录、微信支付、微博登录、热点等。第三方应用使用开发平台沉淀(变现)自己的海量数据资源平台授权机制流程图oauth2.0授权码模式严格的过程。其特点是通过客户端后台服务器与“服务提供者”的认证服务器进行交互,可以满足大部分开放平台的认证授权需求。引入相关依赖>spring-cloud-starter-security配置认证服务器通过内存方式初始化支持授权码方式的客户端@Configuration@AllArgsConstructor@EnableAuthorizationServerpublicclassAuthorizationServerConfigextendsAuthorizationServerConfigurerAdapter{@Override@SneakyThrowspublicvoidconfigure(ClientDetailsS??erviceConfigurerclients){clients.inMemory().withClient("pigx")//client_id.secret("pigx")//client_secret.authorizedGrantTypes("authorization_code")//客户端允许的授权类型。范围(“应用程序”);//Allowedauthorizationscope}}初步完成,测试一下,注意这里是/oauth/authorize不是/oauth/token接口,只需要带上client_id即可。localhost:9999/oauth/authorize?client_id=pigx&response_type=code&redirect_uri=https://pig4cloud.com首先用basic登录,默认用户user,密码已经在控制台输入自己查看是否授权,确认登录成功后回调目标接口通过/oauth/token获取登录token。上图只需要几个简单的步骤就可以完成微信或者其他网站的授权过程,但是到此为止登录还是有点简单的,没有界面,也没有保存用户密码库。授权界面太丑,没有个性化配置安全登录配置非登录拦截重定向到loginPage配置登录完成提交页面路径这里会被springsecurity接管@Primary@Order(90)@ConfigurationpublicclassWebSecurityConfigurerextendsWebSecurityConfigurerAdapter{@Override@SneakyThrowsprotectedvoidconfigure(HttpSecurityhttp){http.formLogin().loginPage("/token/login").loginProcessingUrl("/token/form").and().authorizeRequests().anyRequest().authenticated();}}认证服务器配置用户加载规则实现@Overridepublicvoidconfigure(AuthorizationServerEndpointsConfigurerendpoints){endpoints.userDetailsS??ervice(pigxUserDetailsS??ervice)}//通过这一步加载数据的用户名和密码publicinterfaceUserDetailsS??ervice{UserDetailsloadUserByUsername(Stringvar1)throwsUsernameNotFoundException;}重写原来认证页面/oauth/confirm_access的默认逻辑,让他重定向到我们自己的路径,然后个性化@Overridepublicvoidconfigure(AuthorizationServerEndpointsConfigurerendpoints){endpoints.userDetailsS??ervice(pigxUserDetailsS??ervice).pathMapping("/oauth/confirm_access","/token/confirm_access")}获取上下文中的授权信息,传递给前端/***确认授权页面**@paramrequest*@paramsession*@parammodelAndView*@return*/@GetMapping("/confirm_access")publicModelAndViewconfirm(HttpServletRequestrequest,HttpSessionsession,ModelAndViewmodelAndView){MapscopeList=(Map)request.getAttribute("范围");modelAndView.addObject("scopeList",scopeList.keySet());Objectauth=session.getAttribute("authorizationRequest");if(auth!=null){AuthorizationRequestauthorizationRequest=(AuthorizationRequest)授权;ClientDetailsclientDetails=clientDetailsS??ervice.loadClientByClientId(authorizationRequest.getClientId());modelAndView.addObject("app",clientDetails.getAdditionalInformation());modelAndView.addObject("用户",SecurityUtils.getUser());}模型和视图。setViewName("ftl/确认");返回模型和视图;}最后显示用户头像等信息效果还是不错的说说你是怎么用springcloud的。欢迎关注我们的公众号,获取更多有趣的JavaEE实践