钉钉免登相关操作
在测试钉钉H5界面时,涉及到钉钉免登,故记录以备不时之需。
前端需要进行的操作:
1、安装钉钉h5客户端SDK
npm install dingtalk-jsapi
或者 yarn
yarn add dingtalk-jsapi
2、前端获取免登码
import * as dd from 'dingtalk-jsapi';
dd.ready(function() {
dd.runtime.permission.requestAuthCode({
corpId: 'dingxxxxxx', // 企业id
onSuccess: (info) => {
console.log('info', info)
const code = info.code // 通过该免登授权码可以获取用户身份
// 发送请求到后端接口
axios.post('/login', {
code: code
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
},
onFail: (err) => {
console.log('requestAuthCode err', err)
}
});
});
3、后端通过免登码获取用户信息
String appkey = 'xxxxxxxxxxxxx';
String appSecret = 'xxxxxxxxxxx';
/**
* 获取token
*
* @return 钉钉token
*/
public String accessToken() throws Exception {
// 客户端配置
Config config = new Config();
config.setProtocol("https");
config.setRegionId("central");
// 创建客户端
Client client = new Client(config);
// 请求接口
GetAccessTokenRequest getAccessTokenRequest = new GetAccessTokenRequest()
.setAppKey(appKey) // 企业内部应用 Appkey
.setAppSecret(appSecret); // 企业内部应用 AppSecret
try {
// 获取 AccessToken
GetAccessTokenResponse accessTokenResponse = client.getAccessToken(getAccessTokenRequest);
token = accessTokenResponse.getBody().getAccessToken();
} catch (TeaException err) {
if (!Common.empty(err.code) && !Common.empty(err.message)) {
// err 中含有 code 和 message 属性,可帮助开发定位问题
throw new RuntimeException(StrUtil.format("Request access token error: {}", err.message));
}
} catch (Exception _err) {
TeaException err = new TeaException(_err.getMessage(), _err);
if (!Common.empty(err.code) && !Common.empty(err.message)) {
// err 中含有 code 和 message 属性,可帮助开发定位问题
throw new RuntimeException(StrUtil.format("Request access token error: {}", err.message));
}
}
return token;
}
/**
* 获取用户id
*
* @param authCode 免登录授权码
* @param accessToken accessToken
*/
public String getUserId(String authCode, String accessToken) {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getuserinfo");
OapiV2UserGetuserinfoRequest req = new OapiV2UserGetuserinfoRequest();
req.setCode(authCode);
try {
OapiV2UserGetuserinfoResponse rsp = client.execute(req, accessToken);
if (rsp.isSuccess()) {
OapiV2UserGetuserinfoResponse.UserGetByCodeResponse userGetByCodeResponse = rsp.getResult();
log.debug("用户信息: {}", userGetByCodeResponse);
return userGetByCodeResponse.getUserid();
} else {
throw new RuntimeException(rsp.getErrmsg());
}
} catch (ApiException e) {
throw new RuntimeException(e);
}
}
/**
* 根据userId获取用户信息
*
* @param userId 用户id (钉钉内部用户ID)
* @param accessToken accessToken
*/
public OapiV2UserGetResponse.UserGetResponse getOapiV2UserGetResponseByUserId(String userId, String accessToken) {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
OapiV2UserGetRequest req = new OapiV2UserGetRequest();
req.setUserid(userId);
req.setLanguage("zh_CN");
try {
OapiV2UserGetResponse rsp = client.execute(req, accessToken);
if (rsp.isSuccess()) {
return rsp.getResult();
} else {
throw new RuntimeException(rsp.getErrmsg());
}
} catch (ApiException e) {
e.printStackTrace();
}
return null;
}
/**
* 钉钉免登录获取用户信息
*
* @param authCode 免登录授权码
*/
public OapiV2UserGetResponse.UserGetResponse getUserInfo(String authCode) throws Exception {
// 1. 获取access_token
String accessToken = accessToken();
// 2. 获取用户ID
String userId = getUserId(authCode, accessToken);
// 2. 根据用户ID获取用户详情
return getOapiV2UserGetResponseByUserId(userId, accessToken);
}
4、通过获取到的用户信息,结合自身相关业务,完成用户登录。
本文来自博客园,作者:丹恪梦,转载请注明原文链接:https://www.cnblogs.com/hinay/p/18700025
浙公网安备 33010602011771号