这里简单介绍一下实现过程和整合后的代码,官网的代码比较分散,新手看起来有点困难
免登流程
免登是指用户进入应用后,无需输入钉钉用户名和密码,应用程序可自动获取当前用户身份,进而登录系统的流程。
获取微应用免登授权码
使用以下代码获取免登授权码(调用此api不需要进行鉴权,即不需要进行dd.config)。获取的免登授权码有效期5分钟,且只能使用一次。接口说明,请参考获取微应用免登授权码
说明 第三方企业应用可以在微应用的首页URL中使用$CORPID$做为参数占位符,钉钉容器会将$CORPID$替换为当前访问用户的企业corpId。
例如,微应用首页地址为https://www.dingtalk.com,需要获取当前访问用户的企业corpId值,微应用首页地址可改为https://www.dingtalk.com?corpId=$CORPID$。在进入该首页地址页面时,使用js方法获取当前页面URL,即可获取corpId值。
CORPID获取
地址配置
前端实现代码,移动端和PC端可以用同样的代码实现
<script type="text/javascript">
function GetQueryString(name)
{
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if(r!=null)return unescape(r[2]); return null;
}
dd.runtime.permission.requestAuthCode({
corpId: GetQueryString("corpId"),
onSuccess: function(result) {
console.log(result)
// $("#userName").text(JSON.stringify(result));
//获取当前用户信息
getUserInfo(result.code)
},
onFail: function(err) {
console.log(err)
}
})
function getUserInfo(code) {
$.ajax({
async: false, //同步,异步
url: "获取用户信息的接口地址", //请求的服务端地址
data: {
code: code,
},
type: "post",
success: function(datas) {
//成功之后的处理,返回的数据就是 data
$("#userId").text(JSON.stringify(datas));
//进行登录逻辑处理
},
error: function() {
alert(e); //错误的处理
}
});
}
</script>
后端获取登录用户信息的接口代码
调用过程和步骤
这里的代码是自己封装的框架,不必完全照抄,可按照自己实际情况进行参数接收和处理即可,主要关注中间部分
@MethodAnnotation(method = "getUserInfo", methodWay = "ALL", methoddes = "获取钉钉用户信息")
public void getUserInfo(HttpServletRequest request, HttpServletResponse response) throws Exception {
String authCode=request.getParameter("code");
// 1. 获取access_token
String accessToken = TestDingDing.getAccessToken();
// 2. 获取用户ID
String userId = getUserId(authCode, accessToken);
//3. 获取用户详情
UserGetResponse r = getOapiV2UserGetResponseByUserId(userId, accessToken);
System.out.println(JSON.toJSONString(r));
qury(request, response, r, false, 0);
}
获取授权token
public static String getAccessToken() {
try {
return (JSON.parseObject(getAccessTokenJSON())).getString("access_token");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static String getAccessTokenJSON() {
try {
String token = HttpClient.doGetStr(access_token_url.replaceAll("_appkey", appkey).replaceAll("_appsecret", appsecret));
return token;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
根据授权码和accessToken获取用户ID信息
/**
* 根据authCode获取用户ID
*
* @param authCode
* @param accessToken
* @return
*/
private static String getUserId(String authCode, String accessToken) {
DingTalkClient client = new DefaultDingTalkClient(GET_USER_INFO_URL);
OapiV2UserGetuserinfoRequest req = new OapiV2UserGetuserinfoRequest();
req.setCode(authCode);
OapiV2UserGetuserinfoResponse oapiV2UserGetuserinfoResponse;
try {
oapiV2UserGetuserinfoResponse = client.execute(req, accessToken);
if (oapiV2UserGetuserinfoResponse.isSuccess()) {
OapiV2UserGetuserinfoResponse.UserGetByCodeResponse userGetByCodeResponse = oapiV2UserGetuserinfoResponse.getResult();
return userGetByCodeResponse.getUserid();
} else {
System.out.println(oapiV2UserGetuserinfoResponse.getErrcode()+oapiV2UserGetuserinfoResponse.getErrmsg());
}
} catch (ApiException e) {
// 需要自己处理异常
e.printStackTrace();
}
return null;
}
根据用户ID信息获取钉钉用户详情
/**
* 根据用户ID获取用户详情
*
* @param userId
* @param accessToken
* @return
*/
private static OapiV2UserGetResponse.UserGetResponse getOapiV2UserGetResponseByUserId(String userId, String accessToken) {
DingTalkClient client = new DefaultDingTalkClient(USER_GET_URL);
OapiV2UserGetRequest req = new OapiV2UserGetRequest();
req.setUserid(userId);
req.setLanguage("zh_CN");
try {
OapiV2UserGetResponse oapiV2UserGetResponse = client.execute(req, accessToken);
if (oapiV2UserGetResponse.isSuccess()) {
return oapiV2UserGetResponse.getResult();
} else {
System.out.println(oapiV2UserGetResponse.getErrcode()+oapiV2UserGetResponse.getErrmsg());
}
} catch (ApiException e) {
// 需要自己处理异常
e.printStackTrace();
}
return null;
}
接下来将数据返回给前端,前端根据身份信息做登录的业务逻辑处理
本文含有隐藏内容,请 开通VIP 后查看