钉钉一键登录第三方网站

  • 钉钉开发者后台
    • H5微应用
    • 应用代码开发
    • 登录页面login.html
    • 登录实现LoginController.java
    • pom.xml增加
  • 一键登录效果展示

企业内部系统已经做过了钉钉扫码登录,现在需要添加钉钉一键登录第三方网站功能,这里主要记录一键登录整个实现步骤。

钉钉开发者后台

想要实现钉钉一键登录,首先需要在钉钉开放平台管理平台配置H5微应用

H5微应用

实现钉钉一键登录第三方网站,官方文档地址:实现登录第三方网站根据官方文档的操作步骤来看的话需要先到钉钉开发者后台添加H5微应用,钉钉开发者后台地址:钉钉开发者后台进入钉钉开发者后台后,

选择【企业内部开发】进入

点击右上角【创建应用】

输入【应用名称】,【应用描述】,上传系统图标或者不上传都可以,点击【确认创建】

创建完成之后你就可以看到你创建的H5微应用的应用凭证,点击左侧菜单【权限管理】

这里需要申请【个人手机号信息】、【通讯录个人信息读权限】两个权限,权限申请完成之后点击菜单【登录与分享】

在输入框中输入回调的域名及对应的方法,点击【添加】完成回调URL的配置,这里因为是三套环境(开发、测试、线上),所以配置三套回调URL,三套环境用同一套应用凭证,当然你也可以选择创建三个H5微应用来支持三套环境。

应用代码开发

首先需要在登录页构造钉钉一键登录跳转链接,构造链接参考官方文档

登录页面login.html

登录页面构造好钉钉一键登录链接后的页面效果

页面代码,在原有的登录页面中添加如下代码

<div style="padding-left: 83px;"><button type="button" class="btn-dingding" onclick="toDingDing();">钉钉一键授权登录</button>
</div>

同时在页面增加跳转方法

//钉钉一键授权登录
function toDingDing() {var projectUrl = $("#projectUrl").val();var h5AppKey = $("#h5AppKey").val();var redirect_uri = projectUrl + "dingdingOneClickLogin";redirect_uri = encodeURIComponent(redirect_uri);self.location="https://login.dingtalk.com/oauth2/auth?redirect_uri="+redirect_uri+"&response_type=code&client_id="+h5AppKey+"&scope=openid&state=&prompt=consent";
}

其中:projectUrl 就是获取的请求域名地址
h5AppKey 就是配置的H5微应用的AppKey
至此,页面的内容添加完毕,下面开始来增加后台Java方法

登录实现LoginController.java

登录实现controller需要增加如下方法

    /*** 登录系统* @param use* @return*/private String doLoginSystem(SysUser use) {//已绑定账号则直接登录操作MyUsernamePasswordToken token = new MyUsernamePasswordToken(use.getUnionId(), use.getPassword(),false,true);// 登陆主流程Subject subject = SecurityUtils.getSubject();subject.login(token);return redirect("/index");}public static com.aliyun.dingtalkoauth2_1_0.Client authClient() throws Exception {Config config = new Config();config.protocol = "https";config.regionId = "central";return new com.aliyun.dingtalkoauth2_1_0.Client(config);}/*** 获取用户token* @param authCode* @return* @throws Exception*///接口地址:注意/auth与钉钉登录与分享的回调域名地址一致@RequestMapping(value = "/dingdingOneClickLogin", method = RequestMethod.GET)public String getAccessToken(@RequestParam(value = "authCode")String authCode) throws Exception {com.aliyun.dingtalkoauth2_1_0.Client client = authClient();GetUserTokenRequest getUserTokenRequest = new GetUserTokenRequest()//应用基础信息-应用信息的AppKey,请务必替换为开发的应用AppKey.setClientId(dingDingProperties.getH5AppKey())//应用基础信息-应用信息的AppSecret,,请务必替换为开发的应用AppSecret.setClientSecret(dingDingProperties.getH5AppSecret()).setCode(authCode).setGrantType("authorization_code");GetUserTokenResponse getUserTokenResponse = client.getUserToken(getUserTokenRequest);//获取用户个人tokenString accessToken = getUserTokenResponse.getBody().getAccessToken();GetUserResponseBody userinfo = getUserinfo(accessToken);//根据unionId 获取用户信息String unionId = userinfo.getUnionId();SysUser use = sysUserService.selectUserByUnionId(unionId);String msg = "";if (use != null) {return doLoginSystem(use);}else {//未绑定 则自动添加账号 根据unionid获取useridOapiUserGetbyunionidResponse.UserGetByUnionIdResponse userIdByUnionIdV2 = dingDingService.getUserIdByUnionIdV2(unionId);if (userIdByUnionIdV2 != null && StringUtils.isNotEmpty(userIdByUnionIdV2.getUserid())) {//根据userid获取用户详细信息OapiV2UserGetResponse.UserGetResponse user = dingDingService.getUserDetailByUserid(userIdByUnionIdV2.getUserid(), null);if (user != null) {return saveSysUserAuto(user);}else {msg = "one";}}else {msg = "one";}}return redirect("/login?msg="+msg);}public static com.aliyun.dingtalkcontact_1_0.Client contactClient() throws Exception {Config config = new Config();config.protocol = "https";config.regionId = "central";return new com.aliyun.dingtalkcontact_1_0.Client(config);}/*** 获取用户个人信息* @param accessToken* @return* @throws Exception*/public GetUserResponseBody getUserinfo(String accessToken) throws Exception {com.aliyun.dingtalkcontact_1_0.Client client = contactClient();GetUserHeaders getUserHeaders = new GetUserHeaders();getUserHeaders.xAcsDingtalkAccessToken = accessToken;//获取用户个人信息,如需获取当前授权人的信息,unionId参数必须传meGetUserResponseBody res = client.getUserWithOptions("me", getUserHeaders, new RuntimeOptions()).getBody();return res;}private String saveSysUserAuto(OapiV2UserGetResponse.UserGetResponse user) {List<UserRole> userRoleList = new ArrayList();//整理需要插入数据库字段String userid = user.getUserid();//判断当前用户是否已经插入过了Long userId = null;SysUser sysUser = sysUserService.selectUserByDingDingUserid(userid);if (sysUser != null) {userId = sysUser.getUserId();}else {sysUser = new SysUser();sysUser.setDingdingUserid(userid);sysUser.setAvatar(user.getAvatar());sysUser.setUnionId(user.getUnionid());sysUser.setPhonenumber(user.getMobile());sysUser.setEmail(user.getEmail());sysUser.setTitle(user.getTitle());String userName = user.getName();sysUser.setUserName(userName);//中文转拼音作为loginNameString loginName = PinYinUtils.getPingYin(userName);//根据当前公司人员重名情况,最大重名6人,故此处设置最大重名为10StringBuilder sb = new StringBuilder(loginName).append(",");for (int i = 1; i < 10; i++) {sb.append(loginName+String.valueOf(i)).append(",");}String loginnames = sb.toString();//判断一下当前是否已经存在了loginnameSysUser uniqueuser = sysUserService.selectLastUserByLoginName(Convert.toStrArray(loginnames));if (uniqueuser != null) {//获取当前重名用户的序号String number = uniqueuser.getLoginName().replace(loginName, "");//序号增加1在放回去拼接好int i = 0;if (StringUtils.isNotEmpty(number)) {i = Integer.parseInt(number) + 1;}else {//说明当前loginname还没有后续数字i = 1;}sysUser.setLoginName(loginName+i);}else {sysUser.setLoginName(loginName);}sysUser.randomSalt();//初始未编码前password为123456sysUser.setPassword(passwordService.encryptPassword(sysUser.getLoginName(), "123456", sysUser.getSalt()));sysUser.setCreateBy("扫码登录补充用户");sysUser.setCreateTime(new Date());sysUserService.insertSysUser(sysUser);userId=sysUser.getUserId();//插入用户的角色,初始用户都是普通角色UserRole ur = new UserRole();ur.setUserId(userId);if (Constants.ONE_KEY.equals(user.getUserid()) || Constants.TWO_KEY.equals(user.getUserid())) {ur.setRoleId(1L);}else {ur.setRoleId(2L);}userRoleList.add(ur);}//插入用户的部门List<Long> deptIdList = user.getDeptIdList();if (CollectionUtils.isNotEmpty(deptIdList)) {//插入部门之前需要清除之前的人员部门关系,以防钉钉部门变动而系统未感知int dele = sysUserDeptService.deleteSysUserDeptByUserId(userId);//插入人员部门关系表SysUserDept userDept = new SysUserDept();userDept.setUserId(userId);for (Long deptid : deptIdList) {userDept.setDeptId(deptid);userDept.setCreateBy("扫码登录补充用户");userDept.setCreateTime(new Date());sysUserDeptService.insertSysUserDept(userDept);}}//插入角色if (CollectionUtils.isNotEmpty(userRoleList)) {userRoleMapper.batchUserRole(userRoleList);}//登录系统return doLoginSystem(sysUser);}

其中dingDingService.getUserIdByUnionIdV2(unionId)方法如下

    /*** 根据unionId获取userId 2.0版本* @param unionId 当前钉钉用户在当前企业下的唯一识别码* @return*/@Overridepublic OapiUserGetbyunionidResponse.UserGetByUnionIdResponse getUserIdByUnionIdV2(String unionId) {try {String accessToken = getAccessToken();//根据unionId获取userIdDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/getbyunionid");OapiUserGetbyunionidRequest req = new OapiUserGetbyunionidRequest();req.setUnionid(unionId);OapiUserGetbyunionidResponse rsp = client.execute(req, accessToken);OapiUserGetbyunionidResponse.UserGetByUnionIdResponse result = rsp.getResult();return result;} catch (ApiException e) {e.printStackTrace();}return null;}

dingDingService.getUserDetailByUserid(userIdByUnionIdV2.getUserid(), null)方法如下

    /*** 查询用户详情* @param userid 钉钉userid* @param accessToken* @return*/@Overridepublic OapiV2UserGetResponse.UserGetResponse getUserDetailByUserid(String userid, String accessToken) {try {if (StringUtils.isEmpty(accessToken)) {accessToken = getAccessToken();}DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");OapiV2UserGetRequest req = new OapiV2UserGetRequest();req.setUserid(userid);OapiV2UserGetResponse rsp = client.execute(req, accessToken);OapiV2UserGetResponse.UserGetResponse result = rsp.getResult();return result;} catch (ApiException e) {e.printStackTrace();return null;}}

PinYinUtils.java类如下

package com.dongao.project.utils;import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;/*** @ClassName:PinYinUtils* @author:dongao* @date 2022/2/10 14:05*/
public class PinYinUtils {/*** 中文转拼音* @param inputStr* @return*/public static String getPingYin(String inputStr) {if (inputStr == null || "".equals(inputStr)) {return "";}HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();//UPPERCASE 大写 LOWERCASE 小写format.setCaseType(HanyuPinyinCaseType.LOWERCASE);//WITH_TONE_NUMBER 音标用数字 WITHOUT_TONE 无音标 WITH_TONE_MARK 直接用音标format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);//WITH_U_AND_COLON 用u表示ü WITH_V 用v表示ü WITH_U_UNICODE 用ü表示üformat.setVCharType(HanyuPinyinVCharType.WITH_V);StringBuilder pYStr = new StringBuilder();char[] input = inputStr.trim().toCharArray();try {for (int i = 0; i < input.length; i++) {if (Character.toString(input[i]).matches("[\\u4E00-\\u9FA5]+")) {pYStr.append(PinyinHelper.toHanyuPinyinStringArray(input[i], format)[0]);} else if (!(input[i] == ' ')) {//过滤空格pYStr.append(input[i]);}}} catch (BadHanyuPinyinOutputFormatCombination e) {e.printStackTrace();}return pYStr.toString();}
}

pom.xml增加

pom.xml涉及到的jar包有

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.6</version>
</dependency>
<dependency><groupId>com.aliyun</groupId><artifactId>dingtalk</artifactId><version>1.1.86</version>
</dependency>
<dependency><groupId>com.aliyun</groupId><artifactId>alibaba-dingtalk-service-sdk</artifactId><version>2.0.0</version>
</dependency><dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.0</version>
</dependency>

那么到这里整个关于钉钉一键授权登录的页面代码以及后台逻辑代码也就写完了,下面看一下一键登录的效果

一键登录效果展示

登录页面点击【钉钉一键授权登录】

跳转到钉钉授权页面

点击【立即登录】

跳转到系统首页,这里文中的图片打码主要是由于内容涉及不方便展示,希望可以谅解,整体的流程和代码是可以参考的,如果有问题欢迎大家评论区留言讨论。

钉钉一键登录第三方网站相关推荐

  1. vue实现钉钉扫码登录第三方网站

    (1)### 登录钉钉开放平台,进入应用开发页面,此页面需要管理员开放权限才能进入 (2)### 点击[创建应用],圈出的三部分填写完之后点击[确定创建] (3)### 切换到新版,钉钉登录与分享中填 ...

  2. vue3 钉钉扫码登录第三方网站 最新解决方案

    vue3 钉钉扫码登录 最新解决方案 主要是使用方法和踩坑吧,坑踩的挺大,有vue3一起踩坑的可以相互讨论哈 注意看注释,很多注意点在注释和总结那里 往index.html 添加引入 <scri ...

  3. 记录:实现钉钉(企业内部应用)登录第三方网站

    由于后台无法配合前端配置路由为history模式,故vue路由采用hash模式.但是钉钉扫码成功后会导致重定向地址格式错误: 错误格式:https://xxx.com/?authCode=xxxx#/ ...

  4. 钉钉扫码登录第三方_在钉钉发布公司重要文件,真的安全吗?

    钉钉以疫情在家办公为契机,加上"幸运地"被教育部"选中",在2月5日,钉钉下载量首次超过微信,跃居苹果App Store排行榜第一,并打破App Store记录 ...

  5. 钉钉扫码登录第三方_e签宝联合钉钉升级产品功能,共建企业服务生态闭环

    钉钉微应用更新了,e签宝助力升级.互联网时代下,传统模式的"稳定"已然成为历史,客户的需求在不断变化,我们创新的脚步也从未停止. e签宝携手钉钉,双方着力共建开放.共生.多赢的企业 ...

  6. 详解新浪微博登录第三方网站

    为什么要绑定? 答案:简化用户登录,用第三方账号实现这个网站的登录.通过绑定,还可以获得第三方账号的提供的一些接口信息,可以再本平台直接操作第三方平台,这样,即保存了本网站的用户也有利于第三方网站,实 ...

  7. 企业微信如何实现PC端扫码登录第三方网站

    1 登录企业微信 https://work.weixin.qq.com/ 创建应用 2 在应用里需要配置 工作台应用主页 (即扫码后的跳转地址) 和 企业微信授权里的授权回调域 (必须跟跳转地址是相同 ...

  8. 钉钉授权第三方WEB网站扫码登录

    一.阅读开发文档 首先阅读钉钉官方的开发文档,扫码登录其实用的是官方文档描述的第二种方式,即将钉钉登录二维码内嵌到自己页面中,用户使用钉钉扫码登录第三方网站,网站可以拿到钉钉的用户信息. 二.准备工作 ...

  9. 钉钉企业微信集成免登录

    一.资料 钉钉免登录方案:https://open.dingtalk.com/document/orgapp-server/sso-overview 二.实现 2.1 钉钉实现免登录第三方网站 实现后 ...

最新文章

  1. 这7个实用工具类网站,你用过几个?
  2. php小偷程序原理分析2
  3. 【Matlab】求解积分方程的数值解
  4. C语言学习之打印菱形
  5. javascript创建对象的几种方式 .
  6. CSS3的边框(三)
  7. 学计算机必须学会模拟电路,2016年广西大学计算机与电子信息学院1304电路分析基础与模拟电子线路之电路分析基础复试笔试仿真模拟题...
  8. 《MATLAB信号处理超级学习手册》——2.7 本章小结
  9. mysql阻塞 事务_MySQL Innodb如何找出阻塞事务源头SQL
  10. Beanutils基本用法
  11. c语言调用数学函数根号,不调用库函数求根号x的计算方法(二分/三分/牛顿迭代法)...
  12. 编译原理预测分析程序的实现
  13. android 声音控制面板,音量样式控制面板
  14. 感谢贤心感谢layui
  15. 百度网盘超级会员,年卡低至198元!百度官方直充,会员实时生效!
  16. GYM 101350 I. Mirrored String II
  17. 文献查询、导出手册(包括 Web of Science, Endnote,EI handbook)
  18. ssm项目——CRM客户管理系统开发准备
  19. (数字图像处理MATLAB+Python)第四章图像正交变换-第一节:离散傅里叶变换
  20. 建立二叉树:已知层次遍历顺序建立二叉树、已知先序遍历顺序建立二叉树

热门文章

  1. 有没有一种间隔循环提醒的便签APP
  2. SGAEMDA:基于堆叠图自动编码器的 miRNA-疾病关联预测(cells)
  3. keycode里的回车键
  4. android壁纸选择器预览在哪,如何从活动内启动我的Wallpaper的预览/选择壁纸活动?...
  5. Error parsing Mapper XML. The XML location is file
  6. 一次显卡报错的解决过程
  7. 网页骨架屏自动生成方案(dps)(转载)
  8. Apache安装教程,安装Web服务软件,使自己的电脑变成服务器,并且在局域网内可以被访问。
  9. 维克房地产中介管理系统 v2.5 企业版 是什么
  10. PHP设计模式之简单工厂模式*解读