ionic4 釘釘H5微應用免登錄
【實現結果】
釘釘內打開企業嵌入發佈後的H5微應用無需在輸入賬戶密碼!
【需要參數】
企業H5微應用發佈後的APPID、AppSecret
【實現過程】
前端界面代碼實現
安裝命令
npm install dingtalk-jsapi --save
引入
import * as dd from 'dingtalk-jsapi';
index.html
<link src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.7.13/dingtalk.open.js"/>
核心:
isDing() {
if (dd.env.platform !== 'notInDingTalk') {
// 進行釘釘登錄操作
dd.ready(() => {
dd.runtime.permission.requestAuthCode({
corpId: DingTalkEnum._corpId,
}).then((onSuccess) => {
// 獲取臨時授權碼(code )
this.code = onSuccess.code;
const url = '請求接口' + this.code ;
this.http.get(url).subscribe(
res => {
if (res.json().code === '0000') {
this.token = res.json().data[0].token;
this.name = res.json().data[0].userCode;
// alert(this.token);
localStorage.setItem('Authorization', this.token);
localStorage.setItem('userCode', this.name);
this.loadUserPage();
} else {
localStorage.removeItem('Authorization');
localStorage.removeItem('userCode');
this.loadUserPage();
}
}
);
// 成功即相當於 onSuccess
}, (onFail) => {
// 失敗即相當於 onFail
this.error = onFail.error;
});
});
} else {
this.display = true;
}
}
後端核心代碼
package com.tfjybj.english.provider.controller;
import com.alibaba.fastjson.JSON;
import com.dmsdbj.itoo.tool.httpclient.HTTPUtils;
import com.tfjybj.english.utils.Enum.DingTalkEnumUntil;
import com.tfjybj.english.model.AccessTokenModel;
import com.tfjybj.english.model.AllUserModel;
import com.tfjybj.english.model.UserDingModel;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@Api(tags = {"釘釘免登錄接口"})
@RequestMapping(value = "/DingTalkLoginController")
@RestController
public class DingTalkLoginController {
@Value("${ding_corpid}")
private String corpid;
@Value("${ding_corpsecret}")
private String corpsecret;
/**
* 釘釘免密登錄
* @param code 釘釘臨時授權碼
* @return access_token 釘釘Token
*/
@ApiOperation("獲取釘釘token")
@GetMapping(value = "/loginByCode/{code}")
public AllUserModel getDingToken(@ApiParam(value = "免密登錄臨時授權碼", required = true) @PathVariable String code) {
// 由AppKey與AppSceret組合臨時請求參數
String param = "corpid=" + corpid + "&corpsecret=" + corpsecret;
// 請求獲取AccessToken
String accessToken = HTTPUtils.sendGet(DingTalkEnumUntil.DING_TALK_ENUM_UNTIL_GETTOKEN.getMessage(), param);
// 將返回數據實體接收
AccessTokenModel accessTokenModel = JSON.parseObject(accessToken, AccessTokenModel.class);
// 取出AccessToken
String access_token = accessTokenModel.getAccess_token();
// 根據token和臨時code獲取userid
String dingId = this.getUserInfo(access_token, code);
// 返回根據釘釘ID登錄獲取的數據
return this.dingIdLogin(dingId);
}
/**
* 查詢釘釘取出userID
* @param access_token 釘釘Token
* @param code 臨時Code
* @return
*/
public String getUserInfo(String access_token, String code) {
String param = "access_token=" + access_token + "&code=" + code;
String userInfo = HTTPUtils.sendGet(DingTalkEnumUntil.DING_TALK_ENUM_UNTIL_GETUSERINFO.getMessage(), param);
UserDingModel userDingModel = JSON.parseObject(userInfo, UserDingModel.class);
//返回ding_Id
return userDingModel.getUserid();
}
/**
*請求當前權限釘釘免密登錄接口
* @param dingId 釘釘企業唯一UserID
* @return 當前企業內用戶信息
*/
private AllUserModel dingIdLogin(String dingId) {
String userDing = sendGet(DingTalkEnumUntil.DING_TALK_ENUM_UNTIL.getMessage(), dingId);
return JSON.parseObject(userDing, AllUserModel.class);
}
/**
*
* @param url
* @param param
* @return
*/
public static String sendGet(String url, String param) {
return sendGet(url, param, false);
}
/**
*
* @param url
* @param param
* @param isJson
* @return
*/
public static String sendGet(String url, String param, Boolean isJson) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url + param;
URL realUrl = new URL(urlNameString);
URLConnection connection = realUrl.openConnection();
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
if (isJson) {
connection.setRequestProperty("Content-Type", "application/json; charset=utf-8");
}
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
connection.connect();
Map<String, List<String>> map = connection.getHeaderFields();
Iterator var9 = map.keySet().iterator();
while(var9.hasNext()) {
String key = (String)var9.next();
System.out.println(key + "--->" + map.get(key));
}
String line;
for(in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8")); (line = in.readLine()) != null; result = result + line) {
}
} catch (Exception var19) {
result = "發送 POST 請求出現異常!";
var19.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
} catch (Exception var18) {
var18.printStackTrace();
}
}
return result;
}
}