当前位置: 首页 > 后端技术 > Java

搞定了!OAuth2使用验证码进行授权

时间:2023-04-01 20:06:33 Java

现在验证码登录已经成为很多应用的主流登录方式,但是对于OAuth2授权,手机号验证码处理用户认证非常繁琐,很多同学不知道如何访问它。研究庞哥SpringSecurityOAuth2专栏的会知道一件事。事实上,OAuth2并不关心资源拥有者如何认证,只要资源拥有者在授权环节进行认证即可。至于你的验证码,账号密码,甚至指纹虹膜是什么都无所谓。IdServer的实现所以胖哥好像找到了验证码连接IdServer的方法。之前胖哥开源了一个SpringSecurity登录扩展包spring-security-login-extension,可以一键接入验证码登录和小程序。登录,这应该可以解决问题。于是修改了一下,成功实现了这个功能。看效果:与之前相比,用户在授权过程中可以选择账号密码登录或者手机验证码登录。这里可以绕过,只要是验证码登录就可以兼容吗?这里的大体原则是需要前后端协同来实现的。后端核心还是扩展包的用法。将LoginFilterSecurityConfigurer配置添加到HttpSecurity。这里我稍微改动了一下,和原来的包不太一样。这里,登录成功后无法返回JWT。需与账号密码登录一致。核心代码如下:httpSecurity.apply(newLoginFilterSecurityConfigurer<>())//手机号验证码登录模拟。captchaLogin(captchaLoginConfigurer->//验证CaptchaLoginConfigurer.captchaService(this::verifyCaptchaMock)//根据手机号查询用户UserDetials1此处配置最高优先级2注册为SpringBean.Configuration-free.captchaUserDetailsS??ervice(this::loadUserByPhoneMock)//两次登录一致successHandler(loginAuthenticationSuccessHandler)//两次登录一致failureHandler(authenticationFailureHandler);其中loadUserByPhoneMock模拟CaptchaUserDetailsS??ervice接口,根据手机号加载UserDetails:privateUserDetailsloadUserByPhoneMock(Stringphone)throwsUsernameNotFoundException{return//用户名User.withUsername(phone)//password.password("password").passwordEncoder(PasswordEncoderFactories.createDelegatingPasswordEncoder()::编码).roles(“用户”,“移动”).build();}verifyCaptchaMock是对验证码验证逻辑接口CaptchaService的模拟。这里硬编码为1234,实际开发中应该用缓存实现,从发码接口存入缓存,在CaptchaService中调用缓存接口取出验证码进行验证:privatebooleanverifyCaptchaMock(Stringphone,Stringcode){//todo实现缓存校验逻辑returncode.equals("1234");}发送校验码的接口可以自由实现。这里不需要定义规范。请记住访问缓存。前端只需要访问一个可以切换登录方式的登录页面即可。然后配置验证码登录接口和验证码发送接口即可。授权登录页面为oauth2_login.html。通过它的controller,胖哥还加了一个开关enableCaptchaLogin来决定是否使用验证码认证方式。@GetMapping("/login")publicStringoauth2LoginPage(Modelmodel,@CurrentSecurityContext(expression="authentication")Authentication认证,@Value("${spring.security.oauth2.server.login.captcha.enabled:true}")booleanenableCaptchaLogin,@RequestAttribute(name="org.springframework.security.web.csrf.CsrfToken",required=false)CsrfTokencsrfToken){if(!(authenticationinstanceofAnonymousAuthenticationToken)){return"redirect:/";}if(csrfToken!=null){model.addAttribute("_csrfToken",csrfToken);}系统设置systemSettings=newSystemSettings();model.addAttribute("enableCaptchaLogin",enableCaptchaLogin);model.addAttribute("系统设置",sys设置);return"oauth2_login";}前端和验证码相关的JS处理:if([[${enableCaptchaLogin}]]){form.on('submit(mobile-login)',function(data){letloader=layer.load();让btn=button.load({elem:'.login'});$.ajax({url:'/login/captcha',data:data.field,type:"post",dataType:'json',success:function(result){layer.close(loader);btn.stop(function(){if(result.code===200){popup.success(result.msg,function(){location.href=result.data.targetUrl;})}elseif(result.code===401){popup.failure(result.msg);}})}});返回假;});$('#captcha-btn').click(function(){//TODO在这里访问验证码接口popup.success('验证码已发送');})}关于IdServerIdServer是一个开放的基于SpringAuthorizationServer的源码授权服务器,大大降低了OAuth2授权服务器的学习和使用难度,提供UI控制台,动态权限控制,方便OAuth2客户端管理,可一键生成SpringSecurity配置,开箱即用,支持SpringBoot、SpringCloud等Java生态框架的集成,甚至支持其他语言。它可以通过少量配置进行部署。代码开源,方便二次开发。支持四种OAuth2客户端认证方式和三种授权模式,支持账号密码认证和验证码认证欢迎学习使用和参与代码贡献。总结OAuth2使用验证码授权已经实现,适用于IdServer提供的所有DEMO。有兴趣的可以从以下仓库地址获取最新的验证码授权码,记得给个Star:https://github.com/NotFound403/id-server另外有人问Id的关系Server和胖哥SpringSecurityOAuth2专栏,IdServer是一个开源项目。底层逻辑支持来自对SpringAuthorizationServer的分析。掌握专栏知识,可以帮助您自定义改造IdServer。IdServer的目标是创建一个生产可用的OAuth2授权服务器并减少OAuth2希望你能多多支持我。关注公众号:Felordcn获取更多资讯个人博客:https://felord.cn

猜你喜欢