成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

做一個(gè)開(kāi)源的小程序登錄模塊組件(token)

curlyCheng / 1975人閱讀

摘要:項(xiàng)目目錄包中的就是對(duì)配置參數(shù)的讀取。包是存放一個(gè)的請(qǐng)求工具。返回值為空存在錯(cuò)誤碼,內(nèi)容與存在用戶的信息進(jìn)行對(duì)比,返回用戶,不存在則注冊(cè)用戶模擬獲取到的用戶記得添加掃描包路徑,一個(gè)配合小程序登錄的前后臺(tái)組件形式,附帶前端小程序代碼

先了解下SSO

對(duì)于單點(diǎn)登陸淺顯一點(diǎn)的說(shuō)就是兩種,一種web端的基于Cookie、另一種是跨端的基于Token,一般想要做的都優(yōu)先做Token吧,個(gè)人建議,因?yàn)楹笃跀U(kuò)展也方便哦。

小程序也是呢,做成token的形式是較好的。

流程圖


PS:圖中4的文字打錯(cuò)了~

1、啟動(dòng)服務(wù)
2、小程序初次加載app.js校驗(yàn)token,使用code去換取token
3、檢測(cè)User信息是否存在code,不存在則注冊(cè)新用戶,最后返回對(duì)應(yīng)用戶Id
4、將隨機(jī)Token與UserId一起存入Redis中
5、返回Token信息,小程序存于緩存中,作為api請(qǐng)求的認(rèn)證憑證

這個(gè)流程思路對(duì)什么后臺(tái)語(yǔ)言都是通用的。

具體實(shí)現(xiàn)
本文的環(huán)境主要是做SpringBoot的,所有對(duì)于其他框架可能沒(méi)有很好的兼容。

直接上代碼弄起來(lái)吧!

首先是開(kāi)源的話,我們需要確定某些東西是一定要配置的,不能寫(xiě)死。那么我寫(xiě)了兩個(gè)Config類來(lái)獲取application.yml中的數(shù)據(jù),不同用戶可以配置他們的參數(shù)。

wechat:
  wxurl: https://api.weixin.qq.com/sns/jscode2session?
  appid: wxabc2f8828c8e0049
  appsecret: cec2412a3af99200f4573c337715329a
  granttype: authorization_code
  redis:
    expire: 7200
    wxtoken: wx_token_%s
spring:
  redis:
    port: 6379
    host: 192.168.192.132

我這邊了以上的參數(shù)作為組件中的可配置,其實(shí)部分可以作為默認(rèn)的,不過(guò)暫時(shí)沒(méi)有改了,如果你像要使用就是暫時(shí)都是必選的。

項(xiàng)目目錄


config包中的就是對(duì)配置參數(shù)的讀取。

utils包是存放一個(gè)Http的請(qǐng)求工具。

最核心的就是我們的WechatTemplate類了。

根據(jù)業(yè)務(wù),我們需要以下幾個(gè)方法:

根據(jù)小程序傳遞來(lái)的code獲取openid

/**
 * 獲取OpenId
 * @param code 微信code
 * @return {@link Map}
 */
public Map getOpenId(String code){
    Map back = new HashMap<>();
    Map wxResult = new HashMap<>();
    String wxLoginUrl = weChatComponent.url(code);
    String result = HttpServiceUtils.sendGet(wxLoginUrl);
    if (result.isEmpty()){
        back.put("null","null");
    }else{
        wxResult = (Map) JSON.parse(result);
        if (wxResult.containsKey("errCode")){
            //存在錯(cuò)誤碼
            back.put("errCode",wxResult.get("errCode"));
        }else{
            //不存在錯(cuò)誤碼
            String session_key = wxResult.get("session_key");
            back.put("session_key",session_key);
            log.info("【微信Token】session_key:"+session_key);
            String openid = wxResult.get("openid");
            back.put("openid",openid);
        }
    }
    return back;
}

根據(jù)openid,我們可以和數(shù)據(jù)庫(kù)對(duì)接得到用戶id并生成自己Token

/**
 * 生成Token
 * @param userid 用戶id
 * @return {@link String}
 */
public String granToken(String userid){
    return saveToRedis(userid);
}

/**
 * 獲取Token并存放到redis中
 * @param userid 用戶id
 * @return {@link String}
 */
private String saveToRedis(String userid) {
    String token = UUID.randomUUID().toString();
    Integer expire = redisComponent.getExpire();
    redisTemplate.opsForValue().set(String.format(redisComponent.getWxtoken(),token),userid,expire, TimeUnit.SECONDS);
    return token;
}

還有校驗(yàn)Token,是否存在

/**
 * 校驗(yàn)是否存在用戶信息
 * @param token 唯一值
 * @return {@link Boolean}
 */
public boolean verifyToken(String token){
    String tokenValue = redisTemplate.opsForValue().get(String.format(redisComponent.getWxtoken(),token));
    if (tokenValue.isEmpty()){
        return false;
    }
    return true;
}
Maven包

接著打包發(fā)到Maven中央倉(cāng)庫(kù)中,生成自己的maven包


  com.github.UncleCatMySelf
  wechat-login
  2.1.0
如何使用?

我在Github項(xiàng)目中,做了Demo演示。

我們僅需在Service中調(diào)用,并使用對(duì)應(yīng)方法即可。

@Slf4j
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private WechatTemplate wechatTemplate;

    @Autowired(required = true)
    private ResultVOUtil resultVOUtil;

    @Override
    public ResultVo getToken(String code) {
        Map result = wechatTemplate.getOpenId(code);
        if (result.containsKey("null")){
            return resultVOUtil.error(555,"返回值為空");
        }else if(result.containsKey("errCode")){
            return resultVOUtil.error(666,"存在錯(cuò)誤碼,內(nèi)容:"+result.get("errCode"));
        }else{
            String sessionKey = result.get("session_key");
            String openid = result.get("openid");
            log.info("openid="+openid+"--sessionKey="+sessionKey);
            //與存在用戶的openid信息進(jìn)行對(duì)比,返回用戶id,不存在則注冊(cè)用戶
            String userid = "WX_10agg";//模擬獲取到的用戶id
            String token = wechatTemplate.granToken(userid);
            return resultVOUtil.success(token);
        }
    }

    @Override
    public ResultVo verifyToken(String token) {
        return resultVOUtil.success(wechatTemplate.verifyToken(token));
    }
}
tip:記得添加掃描包路徑,@ComponentScan({"com.github.unclecatmyself"})
GitHub

wechat-login
一個(gè)配合小程序登錄的前后臺(tái)組件(Token形式),附帶前端小程序代碼

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/72295.html

相關(guān)文章

  • 開(kāi)源中國(guó)專訪:Chameleon原理首發(fā),其它跨多端統(tǒng)一框架都是假的?

    摘要:中國(guó)互聯(lián)網(wǎng)絡(luò)信息中心發(fā)布的中國(guó)互聯(lián)網(wǎng)絡(luò)發(fā)展?fàn)顩r統(tǒng)計(jì)報(bào)告顯示,截至年月,我國(guó)網(wǎng)民規(guī)模達(dá)億人,微信月活億支付寶月活億百度月活億另一方面,中國(guó)手機(jī)占智能手機(jī)整體的比例超過(guò),月活約億。在年末正式發(fā)布了面向未來(lái)的跨端的。 開(kāi)源中國(guó)專訪:Chameleon原理首發(fā),其它跨多端統(tǒng)一框架都是假的? 原創(chuàng): 嘉賓-張楠 開(kāi)源中國(guó) 以往我們說(shuō)某一功能跨多端,往往是指在諸如 PC、移動(dòng)等不同類型的設(shè)備之...

    GraphQuery 評(píng)論0 收藏0
  • 前端經(jīng)典文章

    摘要:上周末看這篇文章時(shí),偶有靈光,所以,分享出來(lái)給大家一起看看前端面試四月二十家前端面試題分享請(qǐng)各位讀者添加一下作者的微信公眾號(hào),以后有新的文章,將在微信公眾號(hào)直接推送給各位,非常感謝。 前端切圖神器 avocode 有了這個(gè)神器,切圖再也腰不酸,腿不疼了。 這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機(jī)制,如果讀完本文還不懂,...

    lowett 評(píng)論0 收藏0
  • Spring Security

    摘要:框架具有輕便,開(kāi)源的優(yōu)點(diǎn),所以本譯見(jiàn)構(gòu)建用戶管理微服務(wù)五使用令牌和來(lái)實(shí)現(xiàn)身份驗(yàn)證往期譯見(jiàn)系列文章在賬號(hào)分享中持續(xù)連載,敬請(qǐng)查看在往期譯見(jiàn)系列的文章中,我們已經(jīng)建立了業(yè)務(wù)邏輯數(shù)據(jù)訪問(wèn)層和前端控制器但是忽略了對(duì)身份進(jìn)行驗(yàn)證。 重拾后端之Spring Boot(四):使用JWT和Spring Security保護(hù)REST API 重拾后端之Spring Boot(一):REST API的搭建...

    keelii 評(píng)論0 收藏0
  • 【Geek議題】合理的VueSPA架構(gòu)討論(上)

    摘要:下面也是以模塊的模塊集為例,可以發(fā)現(xiàn)和路由有一些不同就是這里為了防止模塊跟全局耦合,運(yùn)用函數(shù)式編程思想類似于依賴注入,將全局的實(shí)例作為函數(shù)參數(shù)傳入,再返回出一個(gè)包含的對(duì)象,這個(gè)導(dǎo)出的對(duì)象將會(huì)被以模塊名命名,合并到全局的集中。 前言 web前端發(fā)展到現(xiàn)代,已經(jīng)不再是嚴(yán)格意義上的后端MVC的V層,它越來(lái)越向類似客戶端開(kāi)發(fā)的方向發(fā)展,已獨(dú)立擁有了自己的MVVM設(shè)計(jì)模型。前后端的分離也使前端人...

    worldligang 評(píng)論0 收藏0
  • 【Geek議題】合理的VueSPA架構(gòu)討論(上)

    摘要:下面也是以模塊的模塊集為例,可以發(fā)現(xiàn)和路由有一些不同就是這里為了防止模塊跟全局耦合,運(yùn)用函數(shù)式編程思想類似于依賴注入,將全局的實(shí)例作為函數(shù)參數(shù)傳入,再返回出一個(gè)包含的對(duì)象,這個(gè)導(dǎo)出的對(duì)象將會(huì)被以模塊名命名,合并到全局的集中。 前言 web前端發(fā)展到現(xiàn)代,已經(jīng)不再是嚴(yán)格意義上的后端MVC的V層,它越來(lái)越向類似客戶端開(kāi)發(fā)的方向發(fā)展,已獨(dú)立擁有了自己的MVVM設(shè)計(jì)模型。前后端的分離也使前端人...

    pepperwang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<