本文单纯从简单的技术实现来说,不涉及开放平台的多维度的运营理念。前端
经过开放本身平台产品服务的各类API接口,让其余第三方开发者在开发应用时根据需求直接调用,例如微信登陆、QQ登陆、微信支付、微博登陆、热门等。
让第三方应用经过开发平台,使得自身海量数据资源获得沉淀(变现)
目前国内主流的网站的的开放平台,都是基于oauth2.0 协议进行作的开放平台git
受权码模式(authorization code)是功能最完整、流程最严密的受权模式。 它的特色就是经过客户端的后台服务器,与"服务提供商"的认证服务器进行互动,可以知足绝大多数开放平台认证受权的需求。spring
<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
简单的几步就完成上图微信或者其余网站的受权流程,不过目前为止 略显简陋服务器
@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") }
获取上下文中的受权信息,传给前端session
/** * 确认受权页面 * * @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; }