iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何实现OAuth2.0授权系统的验证码功能
  • 662
分享到

如何实现OAuth2.0授权系统的验证码功能

2023-06-15 05:06:57 662人浏览 八月长安
摘要

这篇文章主要介绍了如何实现OAuth2.0授权系统的验证码功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。正文:我这套系统授权基于OAuth3.0实现,登录的是Http:/

这篇文章主要介绍了如何实现OAuth2.0授权系统的验证码功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

正文:

我这套系统授权基于OAuth3.0实现,登录的是Http://xxxx/oauth/token获取access_token。调用其他接口时,带上access_token进行权限认证。所以我要想加验证码,需要把验证码值放到http://xxxx/oauth/token链接上传到服务器进行验证。又因为我使用了Zuul网关,作为网站的入口。我选择在使用Zuul网关的Filter过滤器进行校验验证码。

验证码我使用的是EasyCaptcha,git地址如下:https://gitee.com/whvse/EasyCaptcha。为了快速校验验证信息,我把验证码的值缓存Redis中,具有代码实现如下:

集成EasyCaptcha:

<dependencies>   <dependency>      <groupId>com.GitHub.whvcse</groupId>      <artifactId>easy-captcha</artifactId>      <version>1.6.2</version>   </dependency></dependencies>

生成验证码并保存到Redis中:

    @GetMapping("/captcha")    public Result captcha() {         String captchaKey = "captcha_" + UUID.randomUUID();        // 三个参数分别为宽、高、位数        SpecCaptcha captcha = new SpecCaptcha(130, 60, 4);        // 设置字体 有默认字体,可以不用设置        captcha.setFont(new Font("Verdana", Font.PLaiN, 32));        // 设置类型,纯数字、纯字母、字母数字混合        captcha.setCharType(Captcha.TYPE_ONLY_NUMBER);        log.info("key: [{}] ,code: [{}]", captchaKey, captcha.text());        // 存入Redis ,默认两分钟        redisBaseUtil.set(captchaKey, captcha.text(), 2, TimeUnit.MINUTES);        Map<String, Object> map = new HashMap<>(4);        map.put("captchaKey", captchaKey);        map.put("image", captcha.toBase64());        return Result.success(map);     }

校验验证码的Filter: 

package com.hanxiaozhang.filter; import com.hanxiaozhang.constant.Constant;import com.hanxiaozhang.redis.util.RedisUtil;import com.hanxiaozhang.result.ResultCode;import com.hanxiaozhang.result.Result;import com.hanxiaozhang.util.JSONUtil;import com.netflix.zuul.ZuulFilter;import com.netflix.zuul.context.RequestContext;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest;import java.util.Map; @Slf4j@Componentpublic class CaptchaFilter extends ZuulFilter {     @Autowired    private RedisUtil redisBaseUtil;     @Override    public String filterType() {        return FilterConstants.PRE_TYPE;    }     @Override    public int filterOrder() {        return 0;    }     @Override    public boolean shouldFilter() {        return true;    }     @Override    public Object run() {         RequestContext currentContext = RequestContext.getCurrentContext();        HttpServletRequest serverHttpRequest = currentContext.getRequest();        String uri = serverHttpRequest.getRequestURI();        if (uri.contains("/oauth/token")) {            String method = serverHttpRequest.getMethod();            // 处理跨域Post发送两次请求            if (Constant.OPTIONS.equals(method)) {                return null;            }            Map<String, String[]> parameterMap = serverHttpRequest.getParameterMap();            String[] captchaKeys = null, captchaCodes = null;            if (!parameterMap.isEmpty()                    && (captchaKeys = parameterMap.get("captcha_key")) != null                    && (captchaCodes = parameterMap.get("captcha_code")) != null) {                String captchaKey = captchaKeys[0];                String captchaCode = captchaCodes[0];                log.info("Request Captcha Parameters: key: [{}] ,code: [{}]", captchaKey, captchaCode);                String redisCaptchaCode = redisBaseUtil.get(captchaKey);                String responseBody = null;                if (redisCaptchaCode == null) {                    responseBody = jsonUtil.beanToJson(Result.error(ResultCode.LOGIN_CAPTCHA_EXPIRE));                } else if (!captchaCode.trim().equalsIgnoreCase(redisCaptchaCode)) {                    responseBody = JsonUtil.beanToJson(Result.error(ResultCode.LOGIN_CAPTCHA_ERROR));                }                if (responseBody != null) {                    currentContext.setSendZuulResponse(false);                    currentContext.setResponseStatusCode(200);                    currentContext.getResponse().setContentType(Constant.APP_JSON_UTF_8);                    log.info("Response Parameters: \n [{}]", responseBody);                    currentContext.setResponseBody(responseBody);                }            }        }        return null;    }}

 4.使用,这里使用《idea中HTTP Client请求测试工具》:

1 获取验证码:

GET http://localhost/api/system/captcha

如何实现OAuth2.0授权系统的验证码功能 如何实现OAuth2.0授权系统的验证码功能

2 校验验证码:

POST  http://localhost/api/system/oauth/token?username={{username}}&passWord={{password}}&grant_type=password&scope={{scope}}&client_id={{client_id}}&client_secret={{client_secret}}&captcha_key=captcha_23cacfe5-2751-44af-a34d-5e795caeb46a&captcha_code=5594

成功返回如下: 

如何实现OAuth2.0授权系统的验证码功能

过期返回如下:

如何实现OAuth2.0授权系统的验证码功能

错误返回如下:

 如何实现OAuth2.0授权系统的验证码功能

感谢你能够认真阅读完这篇文章,希望小编分享的“如何实现OAuth2.0授权系统的验证码功能”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: 如何实现OAuth2.0授权系统的验证码功能

本文链接: https://www.lsjlt.com/news/277796.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ 生态系统中流行库和框架的贡献指南
    作为 c++++ 开发人员,通过遵循以下步骤即可为流行库和框架做出贡献:选择一个项目并熟悉其代码库。在 issue 跟踪器中寻找适合初学者的问题。创建一个新分支,实现修复并添加测试。提交...
    99+
    2024-05-15
    框架 c++ 流行库 git
  • C++ 生态系统中流行库和框架的社区支持情况
    c++++生态系统中流行库和框架的社区支持情况:boost:活跃的社区提供广泛的文档、教程和讨论区,确保持续的维护和更新。qt:庞大的社区提供丰富的文档、示例和论坛,积极参与开发和维护。...
    99+
    2024-05-15
    生态系统 社区支持 c++ overflow 标准库
  • c++中if elseif使用规则
    c++ 中 if-else if 语句的使用规则为:语法:if (条件1) { // 执行代码块 1} else if (条件 2) { // 执行代码块 2}// ...else ...
    99+
    2024-05-15
    c++
  • c++中的继承怎么写
    继承是一种允许类从现有类派生并访问其成员的强大机制。在 c++ 中,继承类型包括:单继承:一个子类从一个基类继承。多继承:一个子类从多个基类继承。层次继承:多个子类从同一个基类继承。多层...
    99+
    2024-05-15
    c++
  • c++中如何使用类和对象掌握目标
    在 c++ 中创建类和对象:使用 class 关键字定义类,包含数据成员和方法。使用对象名称和类名称创建对象。访问权限包括:公有、受保护和私有。数据成员是类的变量,每个对象拥有自己的副本...
    99+
    2024-05-15
    c++
  • c++中优先级是什么意思
    c++ 中的优先级规则:优先级高的操作符先执行,相同优先级的从左到右执行,括号可改变执行顺序。操作符优先级表包含从最高到最低的优先级列表,其中赋值运算符具有最低优先级。通过了解优先级,可...
    99+
    2024-05-15
    c++
  • c++中a+是什么意思
    c++ 中的 a+ 运算符表示自增运算符,用于将变量递增 1 并将结果存储在同一变量中。语法为 a++,用法包括循环和计数器。它可与后置递增运算符 ++a 交换使用,后者在表达式求值后递...
    99+
    2024-05-15
    c++
  • c++中a.b什么意思
    c++kquote>“a.b”表示对象“a”的成员“b”,用于访问对象成员,可用“对象名.成员名”的语法。它还可以用于访问嵌套成员,如“对象名.嵌套成员名.成员名”的语法。 c++...
    99+
    2024-05-15
    c++
  • C++ 并发编程库的优缺点
    c++++ 提供了多种并发编程库,满足不同场景下的需求。线程库 (std::thread) 易于使用但开销大;异步库 (std::async) 可异步执行任务,但 api 复杂;协程库 ...
    99+
    2024-05-15
    c++ 并发编程
  • 如何在 Golang 中备份数据库?
    在 golang 中备份数据库对于保护数据至关重要。可以使用标准库中的 database/sql 包,或第三方包如 github.com/go-sql-driver/mysql。具体步骤...
    99+
    2024-05-15
    golang 数据库备份 mysql git 标准库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作