博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于oauth 2.0 实现第三方开放平台
阅读量:5960 次
发布时间:2019-06-19

本文共 3297 字,大约阅读时间需要 10 分钟。

本文单纯从简单的技术实现来讲,不涉及开放平台的多维度的运营理念。

什么是开放平台

通过开放自己平台产品服务的各种API接口,让其他第三方开发者在开发应用时根据需求直接调用,例如微信登录、QQ登录、微信支付、微博登录、热门等。

让第三方应用通过开发平台,使得自身海量数据资源得到沉淀(变现)
目前国内主流的网站的的开放平台,都是基于oauth2.0 协议进行做的开放平台

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

  • 微博开放平台授权机制流程图

oauth2.0 授权码模式

授权码模式(authorization code)是功能最完整、流程最严密的授权模式。 它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动,能够满足绝大多数开放平台认证授权的需求。

引入相关依赖

org.springframework.cloud
spring-cloud-starter-oauth2
org.springframework.cloud
spring-cloud-starter-security
复制代码

配置认证服务器

通过内存模式,初始化一个支持授权码模式的客户端

@Configuration@AllArgsConstructor@EnableAuthorizationServerpublic 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获取登录令牌

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

  1. 登录没有界面,用户密码数据库没有保存
  2. 确认授权界面太丑,没有个性化

配置安全登录

  • 配置未登录拦截重定向到 loginPage
  • 配置登录完成提交的页面路径 这里会被spring security 接管
@Primary@Order(90)@Configurationpublic class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {	@Override	@SneakyThrows	protected void configure(HttpSecurity http) {		http			.formLogin()			.loginPage("/token/login")			.loginProcessingUrl("/token/form")			.and()			.authorizeRequests()			.anyRequest().authenticated();	}}复制代码

认证服务器配置用户加载规则实现

@Overridepublic 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
scopeList = (Map
) 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; }复制代码

最终效果

  • 把用户头像等信息展示出来就蛮好看了

总结

  • 以上源码参考个人项目
  • 欢迎关注我们的公众号获得更多的好玩JavaEE 实践

转载于:https://juejin.im/post/5cad3e445188251b122485f7

你可能感兴趣的文章
Ehcache详细解读(转)
查看>>
Android游戏之平台接入的一点记录
查看>>
源码编译php5.4 ./configure参数
查看>>
13、Cocos2dx 3.0游戏开发找小三之3.0中的Director :郝萌主,一统江湖
查看>>
超人学院Hadoop大数据技术资源分享
查看>>
Oracle迁移:Linux->Windows
查看>>
C# 将MSMQ消息转换成Json格式 【优化】
查看>>
传纸条(一)(双线程dp)
查看>>
bootstrap精简教程
查看>>
【转】c++继承:公有、私有、保护
查看>>
实现经常使用的配置文件/初始化文件读取的一个C程序
查看>>
Intellij idea断点 Debugger slow: Method breakpoints my dramatically slow down debugging
查看>>
第一个JSP程序
查看>>
fromkeys()
查看>>
MySQL start and stop
查看>>
github中的登录认证 转自http://www.wojilu.com/Forum1/Topic/2235
查看>>
eclipse调试运行
查看>>
一次ORA-03113错误解决
查看>>
一道逻辑题,我还是想不出来,太难了
查看>>
Redis数据持久化机制AOF原理分析一---转
查看>>