├── .gitignore
├── README.md
├── backend
├── lib
│ ├── taobao-sdk-java-auto_1479188381469-20210207-source.jar
│ └── taobao-sdk-java-auto_1479188381469-20210207.jar
├── pom.xml
└── src
│ └── main
│ ├── java
│ └── com
│ │ └── aliyun
│ │ └── dingtalk
│ │ ├── Application.java
│ │ ├── config
│ │ └── AppConfig.java
│ │ ├── constant
│ │ └── UrlConstant.java
│ │ ├── controller
│ │ ├── DingTalkConfig.java
│ │ └── DingTalkUserController.java
│ │ ├── exception
│ │ ├── GlobalExceptionResolver.java
│ │ └── InvokeDingTalkException.java
│ │ ├── model
│ │ └── ServiceResult.java
│ │ ├── service
│ │ └── DingTalkUserService.java
│ │ └── util
│ │ └── AccessTokenUtil.java
│ └── resources
│ ├── application.properties
│ └── static
│ ├── asset-manifest.json
│ ├── favicon.ico
│ ├── index.html
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ ├── robots.txt
│ └── static
│ ├── css
│ ├── main.4d812b7e.chunk.css
│ └── main.4d812b7e.chunk.css.map
│ └── js
│ ├── 2.16c0b005.chunk.js
│ ├── 2.16c0b005.chunk.js.LICENSE.txt
│ ├── 2.16c0b005.chunk.js.map
│ ├── 3.878cd095.chunk.js
│ ├── 3.878cd095.chunk.js.map
│ ├── main.69756221.chunk.js
│ ├── main.69756221.chunk.js.map
│ ├── runtime-main.26c91192.js
│ └── runtime-main.26c91192.js.map
├── dingBoot-linux.sh
├── dingBoot-mac.sh
├── dingBoot-windows.bat
├── frontend
├── .gitignore
├── package.json
├── public
│ ├── favicon.ico
│ ├── index.html
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── robots.txt
└── src
│ ├── App.css
│ ├── App.js
│ ├── App.test.js
│ ├── index.css
│ ├── index.js
│ ├── logo.svg
│ ├── reportWebVitals.js
│ └── setupTests.js
└── pom.xml
/.gitignore:
--------------------------------------------------------------------------------
1 | See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 | .idea
21 | /*/*.iml
22 |
23 | npm-debug.log*
24 | yarn-debug.log*
25 | yarn-error.log*
26 |
27 | #target
28 | /*/target
29 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 钉钉用户免登Demo
2 |
3 | ## 1. 功能介绍
4 |
5 | “应用免登录”是指当用户点击一个应用时,无需单独手动输入钉钉用户名和密码,应用程序可自动获取当前用户的钉钉身份,通过钉钉的身份登录应用。
6 |
7 | ## 2. 项目结构
8 |
9 | > **frontend**:前端模块,使用react构建,主要功能有:接入钉钉JSAPI获取authCode、展示免登用户信息。
10 | >
11 | > **backend**:后端模块,使用springboot构建,主要功能有:使用authCode获取access_token、使用access_token获取用户信息、使用用户id获取用户详情等。
12 |
13 | 以下为目录结构与部分核心代码文件:
14 |
15 | ```
16 | .
17 | ├── README.md ----- 说明文档
18 | ├── backend
19 | │ ├── dingBoot-linux.sh ----- 启动脚本(linux)
20 | │ ├── dingBoot-mac.sh ----- 启动脚本(mac)
21 | │ ├── dingBoot-windows.bat ----- 启动脚本(windows)
22 | │ ├── lib ----- 开发SDK包
23 | │ ├── pom.xml
24 | │ └── src
25 | │ └── main
26 | │ ├── java
27 | │ │ └── com
28 | │ │ └── aliyun
29 | │ │ └── dingtalk
30 | │ │ ├── Application.java ----- 启动类
31 | │ │ ├── config
32 | │ │ │ └── AppConfig.java ----- 应用配置类
33 | │ │ ├── constant
34 | │ │ │ └── UrlConstant.java ----- 接口API
35 | │ │ ├── controller
36 | │ │ │ ├── DingTalkConfig.java ----- 获取配置接口
37 | │ │ │ └── DingTalkUserController.java ----- 核心业务接口
38 | │ │ └── service
39 | │ │ └── DingTalkUserService.java ----- 核心业务代码
40 | │ └── resources
41 | │ └── application.properties ----- 应用配置文件
42 | ├── frontend
43 | │ └── src
44 | │ └── App.js ----- 前端展示页面和交互代码
45 | └── pom.xml
46 | ```
47 |
48 | ## 3. 开发环境准备
49 |
50 | 1. 需要有一个钉钉注册企业,如果没有可以创建:https://oa.dingtalk.com/register_new.htm#/
51 |
52 | 2. 成为钉钉开发者,参考文档:https://developers.dingtalk.com/document/app/become-a-dingtalk-developer
53 |
54 | 3. 登录钉钉开放平台后台创建一个H5应用: https://open-dev.dingtalk.com/#/index
55 |
56 | 4. 配置应用:
57 |
58 | ① 配置开发管理,参考文档:https://developers.dingtalk.com/document/app/configure-orgapp
59 |
60 | **此处配置“应用首页地址”需公网地址,若无公网ip,可使用钉钉内网穿透工具:** https://developers.dingtalk.com/document/resourcedownload/http-intranet-penetration
61 |
62 | 
63 |
64 | ② 配置相关权限,参考文档:https://developers.dingtalk.com/document/app/address-book-permissions
65 |
66 | 本demo使用接口权限:"成员信息读权限"
67 |
68 | 
69 |
70 | ## 4. 启动项目
71 |
72 | ### 4.1 脚本启动(推荐)
73 |
74 | 脚本启动,只需执行一条命令即可启动项目,方便快速体验。
75 |
76 | #### 4.1.1 脚本说明
77 |
78 | ① 脚本启动前置条件:
79 |
80 | - 安装配置了java开发环境(jdk、maven)
81 | - 安装配置了git工具
82 |
83 | ② 脚本类型如下:
84 |
85 | ```shell
86 | dingBoot-linux.sh # linux版本
87 | dingBoot-mac.sh # mac版本
88 | dingBoot-windows.bat # windows版本
89 | ```
90 |
91 | #### 4.1.2 下载项目
92 |
93 | ```shell
94 | git clone https://github.com/open-dingtalk/h5app-auth-demo.git
95 | ```
96 |
97 | #### 4.1.3 启动脚本
98 |
99 | 执行时将命令中示例参数替换为**应用参数**,在后端项目(脚本同级目录)下运行命令。
100 |
101 | ① **脚本运行命令:**
102 |
103 | - **执行linux脚本**
104 |
105 | ```shell
106 | ./dingBoot-linux.sh start {项目名} {端口号} {appKey} {appSecret} {agentId} {corpId}
107 | ```
108 |
109 | - **mac系统(使用终端运行,mac m1芯片暂不支持)**
110 |
111 | ```shell
112 | ./dingBoot-mac.sh start {项目名} {端口号} {appKey} {appSecret} {agentId} {corpId}
113 | ```
114 |
115 | - **windows系统 使用cmd命令行启动**
116 |
117 | ```shell
118 | ./dingBoot-windows.bat {项目名} {端口号} {appKey} {appSecret} {agentId} {corpId}
119 | ```
120 |
121 | - **示例(linux脚本执行)**
122 |
123 | ```sh
124 | ./dingBoot-linux.sh start h5-demo 8080 ding1jmkwa4o19bxxxx ua2qNVhleIx14ld6xgoZqtg84EE94sbizRvCimfXrIqYCeyj7b8QvqYxxx 122549400 ding9f50b15bccd1000
125 | ```
126 |
127 | ② **参数获取方法:**
128 |
129 | - 获取corpId——开发者后台首页:https://open-dev.dingtalk.com/#/index 
130 |
131 | - 进入应用开发-企业内部开发-点击进入应用-基础信息-获取appKey、appSecret、agentId 
132 |
133 | #### 4.1.4 启动后配置
134 |
135 | ① **配置访问地址**
136 |
137 | 启动完成会自动生成临时域名,配置方法:进入开发者后台->进入应用->开发管理->应用首页地址和PC端首页地址
138 |
139 | - 生成的域名: 
140 |
141 | - 配置地址: 
142 |
143 | ② **发布应用**
144 |
145 | 配置好地址后进入“版本管理与发布页面”,发布应用,发布后即可在PC钉钉或移动钉钉工作台访问应用
146 |
147 | - 发布应用: 
148 |
149 | ### 4.2 手动启动(与脚本启动二选一)
150 |
151 | #### 4.2.1 下载项目
152 |
153 | ```shell
154 | git clone https://github.com/open-dingtalk/h5app-auth-demo.git
155 | ```
156 |
157 | #### 4.2.2 配置应用参数
158 |
159 | 获取到以下参数,修改后端application.properties
160 |
161 | ```yaml
162 | app:
163 | app_key: *****
164 | app_secret: *****
165 | agent_id: *****
166 | corp_id: *****
167 | ```
168 |
169 | 参数获取方法:登录开发者后台
170 |
171 | - 获取corpId——开发者后台首页:https://open-dev.dingtalk.com/#/index 
172 |
173 | - 进入应用开发-企业内部开发-点击进入应用-基础信息-获取appKey、appSecret、agentId 
174 |
175 | #### 4.2.3 修改前端页面
176 |
177 | **打开项目,命令行中执行以下命令,编译打包生成build文件**(如果不修改页面,则可跳过此步骤)
178 |
179 | ```shell
180 | cd frontend
181 | npm install
182 | npm run build
183 | ```
184 |
185 | **将打包好的静态资源文件放入后端**(如果不修改页面,则可跳过此步骤)
186 |
187 | 
188 |
189 | #### 4.2.4 启动项目
190 |
191 | - 启动SpringBoot(运行启动类Application.java)
192 |
193 | - 启动内网穿透工具,配置应用访问链接并发布应用(参考上方“脚本启动” -> “启动后配置”)
194 |
195 | - 移动端/PC端钉钉点击工作台,找到应用,进入应用体验demo
196 |
197 | ## 5. 页面展示
198 |
199 |
200 |
201 |
202 | ## 6. 参考文档
203 |
204 | 1. H5应用接入JSAPI,文档链接:https://developers.dingtalk.com/document/app/logon-free-process?spm=ding_open_doc.document.0.0.6dbdad29INJCRg#topic-2025319
205 | 2. 获取企业内部应用access_token,文档链接:https://developers.dingtalk.com/document/app/obtain-orgapp-token?spm=ding_open_doc.document.0.0.938247e54bE13v#topic-1936350
206 | 3. 获取用户userId,文档链接:https://developers.dingtalk.com/document/app/obtain-the-userid-of-a-user-by-using-the-log-free?spm=ding_open_doc.document.0.0.5b9077a26qJ9aI#topic-2010561
207 | 4. 获取用户详情,文档链接:https://developers.dingtalk.com/document/app/query-user-details?spm=ding_open_doc.document.0.0.938247e54bE13v#topic-1960047
208 |
--------------------------------------------------------------------------------
/backend/lib/taobao-sdk-java-auto_1479188381469-20210207-source.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/open-dingtalk/h5app-auth-demo/093136c5971fcacc560cd7c88b3569b78d501686/backend/lib/taobao-sdk-java-auto_1479188381469-20210207-source.jar
--------------------------------------------------------------------------------
/backend/lib/taobao-sdk-java-auto_1479188381469-20210207.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/open-dingtalk/h5app-auth-demo/093136c5971fcacc560cd7c88b3569b78d501686/backend/lib/taobao-sdk-java-auto_1479188381469-20210207.jar
--------------------------------------------------------------------------------
/backend/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | com.aliyun.dingtalk
8 | backend
9 | 0.0.1-SNAPSHOT
10 | backend project for &dingtalk
11 |
12 | 1.8
13 | 2.4.3
14 | ${project.artifactId}
15 |
16 |
17 |
18 | org.springframework.boot
19 | spring-boot-starter-web
20 |
21 |
22 |
23 | org.projectlombok
24 | lombok
25 | 1.18.22
26 | true
27 |
28 |
29 | org.springframework.boot
30 | spring-boot-starter-test
31 | test
32 |
33 |
34 |
35 | org.apache.commons
36 | commons-lang3
37 |
38 |
39 |
40 | com.taobao.top
41 | top-api-sdk-dev
42 | dingtalk-SNAPSHOT
43 | system
44 | ${pom.basedir}/lib/taobao-sdk-java-auto_1479188381469-20210207.jar
45 |
46 |
47 |
48 |
49 |
50 |
51 | org.springframework.boot
52 | spring-boot-dependencies
53 | ${spring-boot.version}
54 | pom
55 | import
56 |
57 |
58 |
59 |
60 |
61 | ${applicationName}
62 |
63 |
64 | org.apache.maven.plugins
65 | maven-compiler-plugin
66 | 3.1
67 |
68 | 1.8
69 | 1.8
70 | UTF-8
71 |
72 |
73 |
74 | org.springframework.boot
75 | spring-boot-maven-plugin
76 | ${spring-boot.version}
77 |
78 | true
79 |
80 |
81 |
82 |
83 | repackage
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/backend/src/main/java/com/aliyun/dingtalk/Application.java:
--------------------------------------------------------------------------------
1 | package com.aliyun.dingtalk;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class Application {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(Application.class, args);
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/backend/src/main/java/com/aliyun/dingtalk/config/AppConfig.java:
--------------------------------------------------------------------------------
1 | package com.aliyun.dingtalk.config;
2 |
3 | import lombok.Data;
4 | import org.springframework.beans.factory.annotation.Value;
5 | import org.springframework.context.annotation.Configuration;
6 |
7 | @Configuration
8 | @Data
9 | public class AppConfig {
10 |
11 | @Value("${dingtalk.app_key}")
12 | private String appKey;
13 |
14 | @Value("${dingtalk.app_secret}")
15 | private String appSecret;
16 |
17 | @Value("${dingtalk.corp_id}")
18 | private String corpId;
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/backend/src/main/java/com/aliyun/dingtalk/constant/UrlConstant.java:
--------------------------------------------------------------------------------
1 | package com.aliyun.dingtalk.constant;
2 |
3 | /**
4 | * 钉钉开放接口网关常量
5 | */
6 | public class UrlConstant {
7 |
8 | /**
9 | * 获取access_token url
10 | */
11 | public static final String GET_ACCESS_TOKEN_URL = "https://oapi.dingtalk.com/gettoken";
12 | /**
13 | * 通过免登授权码获取用户信息 url
14 | */
15 | public static final String GET_USER_INFO_URL = "https://oapi.dingtalk.com/topapi/v2/user/getuserinfo";
16 | /**
17 | * 根据用户id获取用户详情 url
18 | */
19 | public static final String USER_GET_URL = "https://oapi.dingtalk.com/topapi/v2/user/get";
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/backend/src/main/java/com/aliyun/dingtalk/controller/DingTalkConfig.java:
--------------------------------------------------------------------------------
1 | package com.aliyun.dingtalk.controller;
2 |
3 | import java.util.HashMap;
4 | import java.util.Map;
5 |
6 | import com.aliyun.dingtalk.config.AppConfig;
7 | import com.aliyun.dingtalk.model.ServiceResult;
8 | import org.springframework.beans.factory.annotation.Autowired;
9 | import org.springframework.web.bind.annotation.GetMapping;
10 | import org.springframework.web.bind.annotation.RestController;
11 |
12 | @RestController
13 | public class DingTalkConfig {
14 |
15 | @Autowired
16 | private AppConfig appConfig;
17 |
18 | /**
19 | * 获取钉钉配置
20 | * @return
21 | */
22 | @GetMapping("/config")
23 | public ServiceResult