釘釘微應用免登實現


  用戶在使用軟件應用的過程中,第一步往往都是登錄。輸入賬號密碼,進行登錄,登錄的目的就是讓應用識別張三是張三,而不是李四。相對應,如果能夠不用輸賬號密碼,應用就知道你是你,就叫做免登。
  免登的源頭還是需要登錄的。業內企業內部登錄往往采用統一登錄中心SSO的方案,比如集成CAS。一個同一地址登錄,同一域名下采用識別cookie的方式解析用戶名。也就是,登錄了OA之后,訪問HR、郵箱等等,在關閉瀏覽器之前,不需要再次登錄。釘應用實現免登,本質上也是通過釘釘實現登錄。因為使用者已經輸入賬號密碼或者手機號驗證碼在釘釘實現了登錄,釘釘已經保存了用戶的信息。

具體實踐,實現釘應用免登可以分為下面幾個步驟。
1、釘應用用戶信息與釘釘通訊錄打通。比如用戶通過手機號實現關聯。
2、前端代碼,調用JSapi獲取免登授權碼。
3、后端代碼,調用服務端接口解析授權碼,實現登錄。
4、后端代碼,識別用戶后,實現登錄邏輯。

  下面用后台java代碼和前端vue代碼來實際說明。
  通訊錄的同步忽略了,按照釘釘服務端接口能夠實現同步。我們直接看前端的獲取免登授權碼該如何獲取。

loginByCode(corpId) { const _this = this; console.log("requestAuthCode begin"); _this.dd.runtime.permission.requestAuthCode({ corpId: corpId, onSuccess: function (result) { console.log("requestAuthCode:" + result.code); _this.httpUtils.appGet('/login/loginByCode?code=' + result.code).then(function (res) { const user = res.data; window.localStorage.setItem("user", JSON.stringify(user)); }, function (r) { _this.commonUtils.commonAlert(r.msg); }) }, onFail: function (err) { alert("客戶端-獲取免登授權碼失敗:" + JSON.stringify(err)); } }) },

  上面的代碼塊封裝了loginByCode的方法,其主要功能就是獲取授權碼,然后將授權碼傳到后台,獲取用戶信息。關鍵的代碼就是

dd.runtime.permission.requestAuthCode

  這一個函數需要傳入一個corpId作為參數,該參數在企業后台能夠找到。獲取授權碼失敗,我們可以把錯誤信息彈框顯示出來。獲取成功,就可以請求后台的接口拉取用戶信息。接下來看看后台是如何實現的。

@GetMapping("loginByCode") public UserVO list(@RequestParam String code) { log.info(code); UserInfoByCodeResponse response = userInfoByCodeRequest.get(code); return dingUserQueryService.getVOByUserId(response.getUserid()); }

  上圖后端代碼展示了獲取用戶信息的順序,即先解析授權碼,得到用戶信息,然后再去匹配用戶信息,找到當前的用戶。這里簡化了登錄的業務步驟,如果有集成鑒權,這一塊是需要另寫代碼實現。接下來詳細了解下userInfoByCodeRequest做了什么。

private String userInfoUrl = "https://oapi.dingtalk.com/user/getuserinfo?access_token={accessToken}&code={code}"; public UserInfoByCodeResponse get(String code) { Map<String, Object> param = tokenService.getTokenMap(); param.put("code",code); return requestUtils.getWithUrlParam(userInfoUrl, UserInfoByCodeResponse.class, param); }

  如圖所示,其實就是做了個請求,請求URL關鍵標識為user/getuserinfo。釘釘會返回用戶數據,且釘釘返回的數據會包含userid,通過userid這一數據在應用從釘釘通訊錄同步過來的數據中,即可定位到一位用戶,這也就是下面這行代碼做的事情。

dingUserQueryService.getVOByUserId(response.getUserid()

  注意這行代碼是完全在應用內實現的,比如筆者這里就是去數據庫根據userid查找用戶,返回用戶信息。至此,微應用免登就實現完畢,是不是很簡單呢。覺得簡單就點個贊留個言吧,有問題歡迎聯系筆者共同探討。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM