91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現OAuth2.0授權系統的驗證碼功能

發布時間:2021-05-25 14:02:34 來源:億速云 閱讀:317 作者:小新 欄目:開發技術

這篇文章主要介紹了如何實現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中,具有代碼實現如下:

1.集成EasyCaptcha:

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

2.生成驗證碼并保存到Redis中:

/**
     * 驗證碼
     *
     * @return
     */
    @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);
 
    }

3. 校驗驗證碼的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;
 
/**
 * 〈一句話功能簡述〉<br>
 * 〈驗證碼過濾器〉
 *
 * @author hanxinghua
 * @create 2021/4/4
 * @since 1.0.0
 */
@Slf4j
@Component
public 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請求測試工具》:

4.1 獲取驗證碼:

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

如何實現OAuth2.0授權系統的驗證碼功能 如何實現OAuth2.0授權系統的驗證碼功能

4.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授權系統的驗證碼功能”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

堆龙德庆县| 汽车| 灵山县| 松江区| 阿荣旗| 新源县| 平塘县| 南通市| 平利县| 牙克石市| 韩城市| 吉林市| 水富县| 宁蒗| 康平县| 太仓市| 贡山| 平泉县| 辛集市| 大厂| 科技| 罗甸县| 潮州市| 马鞍山市| 西乌珠穆沁旗| 乐业县| 乐安县| 通化县| 玉门市| 樟树市| 东城区| 崇左市| 阜南县| 哈密市| 沂源县| 永靖县| 上犹县| 渭南市| 平罗县| 龙江县| 厦门市|