钉钉免登录获取用户信息(身份验证)

一.客户端API

1.通过钉钉客户端提供的API,获取authCode(授权码)

dd.getAuthCode({
  // corpId 小程序可为空,H5应用必填
  corpId: '',
  success: (res) => {
    console.log(res.authCode)
  }
  //fail 和 complete 可省略
});

获取corpId的地方(应用开发->左边目录:客户端API->身份与免登->获取凭证->getAuthCode->右边画面:支持说明,下面有两个去预览随便点一个即可->画面上:入参下的参数值)

2.写请求服务端代码

dd.httpRequest({
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  data: {
	authCode:res.authCode
  },
  //请求方式
  method: 'GET',
  dataType: 'json',
  timeout: 30000,
  //请求后端地址
  url: 'http://127.0.0.1:9090/dd/login',
  //后端返回结果(回调函数)
  success: (result) => {
	console.log(result)
	console.log("请求成功")
	that.setData({
	  authCode:res.authCode,
	  corpId:corpId==''?'小程序的corpId可为空,H5应用中企业corpId必填':corpId,
	  userId:result.data.userId,
	  userName:result.data.userName
	})
  },
  fail: (error) => { 
	console.log("请求失败")
  }
})

3.把第1步和第2步结合一起

Page({
  data: {
    authCode:'',
    corpId:'',
    userId:'',
    userName:''
  },
  submitBtn(event){
	const that = this
	const corpId = ''
	dd.getAuthCode({
	  corpId: corpId,
	  success: (res) => {
		dd.httpRequest({
		  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
		  data: {
			authCode:res.authCode
		  },
		  method: 'GET',
		  dataType: 'json',
		  timeout: 30000,
		  url: 'http://127.0.0.1:9090/dd/login',
		  success: (result) => {
			console.log(result)
			console.log("请求成功")
			that.setData({
			  authCode:res.authCode,
			  corpId:corpId==''?'小程序的corpId可为空,H5应用中企业corpId必填':corpId,
			  userId:result.data.userId,
			  userName:result.data.userName
			})
		  },
		  fail: (error) => { 
			console.log("请求失败")
		  }
		})
	  }
	});
  }
})

submitBtn是一个点击事件(onTap = 'submitBtn')

二.服务端API

导入pom.xml

        <!--钉钉工具包-->
        <!--systemPath,在跟目录下创建文件夹lib,把从钉钉开发文档中下载.jar包taobao-sdk-java-auto_xxx.jar放入到这个文件夹中-->
        <dependency>
            <groupId>com.dingtalk</groupId>
            <artifactId>dingtalk-api-sdk</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <scope>system</scope>
            <systemPath>${pom.basedir}/lib/taobao-sdk-java-auto_1479188381469-20210207.jar</systemPath>
        </dependency>

1.Controller层

@RestController
@RequestMapping("/dd")
public class DDController {
    @Autowired
    private UserManagerService userManager;

    /**
     * 根据免登录授权码.获取登录用户身份
     * @param authCode
     * @return
     */
    @GetMapping("/login")
    public Map<String, Object> login(@RequestParam("authCode") String authCode){
        try {
            // 1. 获取用户id
            String userId = userManager.getUserId(authCode);
            // 2. 获取用户名称
            String userName = userManager.getUserName(userId);
            // 3. 返回用户身份
            Map<String, Object> resultMap = new HashMap<>();
            resultMap.put("code", 200);
            resultMap.put("userId", userId);
            resultMap.put("userName", userName);
            return resultMap;
        } catch (Exception ex) {
            //异常时,返回异常
            Map<String, Object> resultMap = new HashMap<>();
            resultMap.put("code", 500);
            //自定义获取大致异常工具:ExceptionUtil.getRootErrorMessage()
            resultMap.put("error", ExceptionUtil.getRootErrorMessage(ex));
            return resultMap;
        }
    }

}

2.获取access_token

/**
 * 获取access_token工具类
 */
public class AccessTokenUtil {

    public static String getAccessToken() throws ApiException {
        DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
        OapiGettokenRequest request = new OapiGettokenRequest();
        //开发者后台->应用开发-企业内部应用->选择您的小程序->凭证与基础信息->AppKey
        request.setAppkey("APP_KEY");
        //开发者后台->应用开发-企业内部应用->选择您的小程序->凭证与基础信息->AppSecret
        request.setAppsecret("APP_SECRET");
        //必须时GET请求,否则,会报错
        request.setHttpMethod("GET");
        OapiGettokenResponse response = client.execute(request);

        return response.getAccessToken();
    }
}

3.获取用户Id和用户名

@Component
public class UserManagerService {

    /**
     * 根据免登授权码获取用户id
     *
     * @param authCode 免登授权码
     * @return
     */
    public String getUserId(String authCode) throws ApiException {
        // 1. 获取access_token
        String accessToken = AccessTokenUtil.getAccessToken();
        // 2. 获取用户信息(通过免登授权码获取用户信息 url)
        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getuserinfo");
        OapiV2UserGetuserinfoRequest req = new OapiV2UserGetuserinfoRequest();
        req.setCode(authCode);
        OapiV2UserGetuserinfoResponse rsp = client.execute(req, accessToken);
        System.out.println(rsp.getBody());
        // 3. 返回用户id
        return rsp.getResult().getUserid();
    }

    /**
     * 根据用户id获取用户名称
     *
     * @param userId 用户id
     * @return
     */
    public String getUserName(String userId) throws ApiException {
        // 1. 获取access_token
        String accessToken = AccessTokenUtil.getAccessToken();
        // 2. 获取用户详情(根据用户id获取用户详情 url)
        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
        OapiV2UserGetRequest req = new OapiV2UserGetRequest();
        req.setUserid(userId);
        req.setLanguage("zh_CN");
        OapiV2UserGetResponse rsp = client.execute(req, accessToken);
        // 3. 返回用户名称
        return rsp.getResult().getName();
    }

}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在Vue中实现钉钉登录获取用户信息,你可以按照以下步骤进行操作: 1. 引用中的代码示例,首先在Vue组件中引入钉钉的JSAPI库,并定义一个函数`dingding_no_login`来处理钉钉登录的逻辑。 2. 使用`dd.ready`方法来确保钉钉环境准备就绪后,调用`dd.runtime.permission.requestAuthCode`方法获取登授权码。在`onSuccess`回调中,可以通过`info.code`获取登授权码。 3. 将登授权码发送给后端接口进行验证,并获取用户信息。可以使用`await`关键字来等待后端接口返回结果。 4. 在获取用户信息后,可以进行相应的跳转或保存用户信息的操作。 以下是一个示例代码,展示了如何在Vue中实现钉钉登录获取用户信息: ```javascript import * as dd from 'dingtalk-jsapi' export default { methods: { async dingding_no_login() { if (dd.env.platform != 'notInDingTalk') { dd.ready(async () => { dd.runtime.permission.requestAuthCode({ corpId: "企业id", onSuccess: async (info) => { const res = await dingdingNoLogin({ code: info.code }) // 进行跳转或保存token的操作 } }); }); } } }, mounted() { this.dingding_no_login(); } } ``` 注意替换代码中的"企业id"为你的实际企业id。同时,你需要根据实际需求进行相应的跳转或保存用户信息的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [前端vue 钉钉内部使用公司内部系统登录 微应用登录](https://blog.csdn.net/weixin_64064327/article/details/125711817)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [钉钉 基于vue开发h5微应用,登录获取用户信息](https://blog.csdn.net/weixin_40079913/article/details/120198601)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值