基于oauth 2.0 开发第三方开放平台

什么是开放平台

经过开放本身平台产品服务的各类API接口,让其余第三方开发者在开发应用时根据需求直接调用,例如微信登陆、QQ登陆、微信支付、微博登陆、热门等。
让第三方应用经过开发平台,使得自身海量数据资源获得沉淀(变现)
目前国内主流的网站的的开放平台,都是基于oauth2.0 协议进行作的开放平台前端

  • 微信开放平台受权机制流程图git

图片

  • 微博开放平台受权机制流程图 图片spring

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,密码已经打在控制台本身查便可 图片微信

  • 受权确认 图片session

  • 登陆成功带着code回调到目标接口 图片app

  • 经过/oauth/token获取登陆令牌ide

简单的几步就完成上图微信或者其余网站的受权流程,不过目前为止 略显简陋

  1. 登陆没有界面,用户密码数据库没有保存

  2. 确认受权界面太丑,没有个性化

配置安全登陆

  • 配置未登陆拦截重定向到 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先后分离的开发平台  https://gitee.com/log4j/pig

相关文章
相关标签/搜索