摘要:項目目錄包中的就是對配置參數(shù)的讀取。包是存放一個的請求工具。返回值為空存在錯誤碼,內(nèi)容與存在用戶的信息進(jìn)行對比,返回用戶,不存在則注冊用戶模擬獲取到的用戶記得添加掃描包路徑,一個配合小程序登錄的前后臺組件形式,附帶前端小程序代碼
先了解下SSO
對于單點登陸淺顯一點的說就是兩種,一種web端的基于Cookie、另一種是跨端的基于Token,一般想要做的都優(yōu)先做Token吧,個人建議,因為后期擴(kuò)展也方便哦。
小程序也是呢,做成token的形式是較好的。
流程圖
PS:圖中4的文字打錯了~
1、啟動服務(wù) 2、小程序初次加載app.js校驗token,使用code去換取token 3、檢測User信息是否存在code,不存在則注冊新用戶,最后返回對應(yīng)用戶Id 4、將隨機(jī)Token與UserId一起存入Redis中 5、返回Token信息,小程序存于緩存中,作為api請求的認(rèn)證憑證
這個流程思路對什么后臺語言都是通用的。
具體實現(xiàn)本文的環(huán)境主要是做SpringBoot的,所有對于其他框架可能沒有很好的兼容。
直接上代碼弄起來吧!
首先是開源的話,我們需要確定某些東西是一定要配置的,不能寫死。那么我寫了兩個Config類來獲取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ù)作為組件中的可配置,其實部分可以作為默認(rèn)的,不過暫時沒有改了,如果你像要使用就是暫時都是必選的。
項目目錄
config包中的就是對配置參數(shù)的讀取。
utils包是存放一個Http的請求工具。
最核心的就是我們的WechatTemplate類了。
根據(jù)業(yè)務(wù),我們需要以下幾個方法:
根據(jù)小程序傳遞來的code獲取openid
/** * 獲取OpenId * @param code 微信code * @return {@link Map} */ public MapgetOpenId(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")){ //存在錯誤碼 back.put("errCode",wxResult.get("errCode")); }else{ //不存在錯誤碼 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ù)庫對接得到用戶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; }
還有校驗Token,是否存在
/** * 校驗是否存在用戶信息 * @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中央倉庫中,生成自己的maven包
如何使用?com.github.UncleCatMySelf wechat-login 2.1.0
我在Github項目中,做了Demo演示。
我們僅需在Service中調(diào)用,并使用對應(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) { Mapresult = wechatTemplate.getOpenId(code); if (result.containsKey("null")){ return resultVOUtil.error(555,"返回值為空"); }else if(result.containsKey("errCode")){ return resultVOUtil.error(666,"存在錯誤碼,內(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)行對比,返回用戶id,不存在則注冊用戶 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
一個配合小程序登錄的前后臺組件(Token形式),附帶前端小程序代碼
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/72295.html
摘要:中國互聯(lián)網(wǎng)絡(luò)信息中心發(fā)布的中國互聯(lián)網(wǎng)絡(luò)發(fā)展?fàn)顩r統(tǒng)計報告顯示,截至年月,我國網(wǎng)民規(guī)模達(dá)億人,微信月活億支付寶月活億百度月活億另一方面,中國手機(jī)占智能手機(jī)整體的比例超過,月活約億。在年末正式發(fā)布了面向未來的跨端的。 開源中國專訪:Chameleon原理首發(fā),其它跨多端統(tǒng)一框架都是假的? 原創(chuàng): 嘉賓-張楠 開源中國 以往我們說某一功能跨多端,往往是指在諸如 PC、移動等不同類型的設(shè)備之...
摘要:上周末看這篇文章時,偶有靈光,所以,分享出來給大家一起看看前端面試四月二十家前端面試題分享請各位讀者添加一下作者的微信公眾號,以后有新的文章,將在微信公眾號直接推送給各位,非常感謝。 前端切圖神器 avocode 有了這個神器,切圖再也腰不酸,腿不疼了。 這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機(jī)制,如果讀完本文還不懂,...
摘要:框架具有輕便,開源的優(yōu)點,所以本譯見構(gòu)建用戶管理微服務(wù)五使用令牌和來實現(xiàn)身份驗證往期譯見系列文章在賬號分享中持續(xù)連載,敬請查看在往期譯見系列的文章中,我們已經(jīng)建立了業(yè)務(wù)邏輯數(shù)據(jù)訪問層和前端控制器但是忽略了對身份進(jìn)行驗證。 重拾后端之Spring Boot(四):使用JWT和Spring Security保護(hù)REST API 重拾后端之Spring Boot(一):REST API的搭建...
摘要:下面也是以模塊的模塊集為例,可以發(fā)現(xiàn)和路由有一些不同就是這里為了防止模塊跟全局耦合,運用函數(shù)式編程思想類似于依賴注入,將全局的實例作為函數(shù)參數(shù)傳入,再返回出一個包含的對象,這個導(dǎo)出的對象將會被以模塊名命名,合并到全局的集中。 前言 web前端發(fā)展到現(xiàn)代,已經(jīng)不再是嚴(yán)格意義上的后端MVC的V層,它越來越向類似客戶端開發(fā)的方向發(fā)展,已獨立擁有了自己的MVVM設(shè)計模型。前后端的分離也使前端人...
摘要:下面也是以模塊的模塊集為例,可以發(fā)現(xiàn)和路由有一些不同就是這里為了防止模塊跟全局耦合,運用函數(shù)式編程思想類似于依賴注入,將全局的實例作為函數(shù)參數(shù)傳入,再返回出一個包含的對象,這個導(dǎo)出的對象將會被以模塊名命名,合并到全局的集中。 前言 web前端發(fā)展到現(xiàn)代,已經(jīng)不再是嚴(yán)格意義上的后端MVC的V層,它越來越向類似客戶端開發(fā)的方向發(fā)展,已獨立擁有了自己的MVVM設(shè)計模型。前后端的分離也使前端人...
閱讀 743·2021-10-14 09:42
閱讀 1995·2021-09-22 15:04
閱讀 1606·2019-08-30 12:44
閱讀 2167·2019-08-29 13:29
閱讀 2762·2019-08-29 12:51
閱讀 577·2019-08-26 18:18
閱讀 733·2019-08-26 13:43
閱讀 2846·2019-08-26 13:38