1
1
# spring-boot-demo-social
2
2
3
- > 此 demo 主要演示 Spring Boot 项目如何使用 ** [ 史上最全的第三方登录工具 - JustAuth] ( https://github.com/zhangyd-c/JustAuth ) ** 实现第三方登录。
3
+ > 此 demo 主要演示 Spring Boot 项目如何使用 ** [ 史上最全的第三方登录工具 - JustAuth] ( https://github.com/zhangyd-c/JustAuth ) ** 实现第三方登录,包括QQ登录、GitHub登录、微信登录、谷歌登录、微软登录、小米登录、企业微信登录 。
4
4
>
5
- > 如果技术选型是 ` JFinal ` 的,请查看此 [ ** ` demo ` ** ] ( https://github.com/xkcoding/jfinal-justauth-demo )
6
- >
7
- > https://github.com/xkcoding/jfinal-justauth-demo
8
- >
9
- > 如果技术选型是 ` ActFramework ` 的,请查看此 [ ** ` demo ` ** ] ( https://github.com/xkcoding/act-justauth-demo )
10
- >
11
- > https://github.com/xkcoding/act-justauth-demo
5
+ > 通过 [ justauth-spring-boot-starter] ( https://search.maven.org/artifact/com.xkcoding/justauth-spring-boot-starter ) 快速集成,好嗨哟~
12
6
>
13
7
> JustAuth,如你所见,它仅仅是一个** 第三方授权登录** 的** 工具类库** ,它可以让我们脱离繁琐的第三方登录SDK,让登录变得** So easy!**
14
8
>
15
9
> 1 . ** 全** :已集成十多家第三方平台(国内外常用的基本都已包含),后续依然还有扩展计划!
16
- > 2 . ** 简** :API就是奔着最简单去设计的(见后面[ ` 快速开始 ` ] ( https://github.com/zhangyd-c/JustAuth#%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B ) ),尽量让您用起来没有障碍感!
17
- >
18
- > PS: 本人十分幸运的参与到了这个SDK的开发,主要开发了** QQ登录、微信登录、小米登录、微软登录、谷歌登录** 这 ** ` 5 ` ** 个第三方登录,以及一些BUG的修复工作。再次感谢 [ @母狼] ( https://github.com/zhangyd-c ) 开源这个又好用又全面的第三方登录SDK。
10
+ > 2 . ** 简** :API就是奔着最简单去设计的(见后面[ ` 快速开始 ` ] ( https://github.com/zhangyd-c/JustAuth#%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B ) ),尽量让您用起来没有障碍感!
11
+ >
12
+ > PS: 本人十分幸运的参与到了这个SDK的开发,主要开发了** QQ登录、微信登录、小米登录、微软登录、谷歌登录** 这 ** ` 5 ` ** 个第三方登录,以及一些BUG的修复工作。再次感谢 [ @母狼] ( https://github.com/zhangyd-c ) 开源这个又好用又全面的第三方登录SDK。
13
+
14
+ 如果技术选型是 ` JFinal ` 的,请查看此 [ ** ` demo ` ** ] ( https://github.com/xkcoding/jfinal-justauth-demo )
15
+
16
+ https://github.com/xkcoding/jfinal-justauth-demo
17
+
18
+ 如果技术选型是 ` ActFramework ` 的,请查看此 [ ** ` demo ` ** ] ( https://github.com/xkcoding/act-justauth-demo )
19
+
20
+ https://github.com/xkcoding/act-justauth-demo
19
21
20
22
## 1. 环境准备
21
23
@@ -229,6 +231,10 @@ $ nginx -s reload
229
231
230
232
![ image-20190617151624603] ( assets/image-20190617151624603.png )
231
233
234
+ #### 1.5.7. 企业微信平台申请
235
+
236
+ > 参考:https://xkcoding.com/2019/08/06/use-justauth-integration-wechat-enterprise.html
237
+
232
238
## 2. 主要代码
233
239
234
240
### 2.1. pom.xml
@@ -256,7 +262,7 @@ $ nginx -s reload
256
262
<project .build.sourceEncoding>UTF-8</project .build.sourceEncoding>
257
263
<project .reporting.outputEncoding>UTF-8</project .reporting.outputEncoding>
258
264
<java .version>1.8</java .version>
259
- <spring .social. version>1.1.6.RELEASE</ spring .social .version>
265
+ <justauth- spring-boot . version>1.0.0</ justauth- spring-boot .version>
260
266
</properties >
261
267
262
268
<dependencies >
@@ -271,11 +277,22 @@ $ nginx -s reload
271
277
<scope >test</scope >
272
278
</dependency >
273
279
280
+ <dependency >
281
+ <groupId >org.springframework.boot</groupId >
282
+ <artifactId >spring-boot-starter-data-redis</artifactId >
283
+ </dependency >
284
+
285
+ <!-- 对象池,使用redis时必须引入 -->
286
+ <dependency >
287
+ <groupId >org.apache.commons</groupId >
288
+ <artifactId >commons-pool2</artifactId >
289
+ </dependency >
290
+
274
291
<!-- oauth工具类 -->
275
292
<dependency >
276
- <groupId >me.zhyd.oauth </groupId >
277
- <artifactId >JustAuth </artifactId >
278
- <version >1.9.5 </version >
293
+ <groupId >com.xkcoding </groupId >
294
+ <artifactId >justauth-spring-boot-starter </artifactId >
295
+ <version >${justauth-spring-boot.version} </version >
279
296
</dependency >
280
297
281
298
<dependency >
@@ -316,6 +333,27 @@ server:
316
333
servlet :
317
334
context-path : /demo
318
335
336
+ spring :
337
+ redis :
338
+ host : localhost
339
+ # 连接超时时间(记得添加单位,Duration)
340
+ timeout : 10000ms
341
+ # Redis默认情况下有16个分片,这里配置具体使用的分片
342
+ # database: 0
343
+ lettuce :
344
+ pool :
345
+ # 连接池最大连接数(使用负值表示没有限制) 默认 8
346
+ max-active : 8
347
+ # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
348
+ max-wait : -1ms
349
+ # 连接池中的最大空闲连接 默认 8
350
+ max-idle : 8
351
+ # 连接池中的最小空闲连接 默认 0
352
+ min-idle : 0
353
+ cache :
354
+ # 一般来说是不用配置的,Spring Cache 会根据依赖的包自行装配
355
+ type : redis
356
+
319
357
oauth :
320
358
qq :
321
359
client-id : 1015*****
@@ -341,85 +379,16 @@ oauth:
341
379
client-id : 2882303**************
342
380
client-secret : nFeTt89Yn**************
343
381
redirect-uri : http://oauth.xkcoding.com/demo/oauth/mi/callback
382
+ wechat_enterprise :
383
+ client-id : ww58**********6fbc
384
+ client-secret : 8G6PCr0****************************yzaPc78
385
+ redirect-uri : http://oauth.xkcoding.com/demo/oauth/wechat_enterprise/callback
386
+ agent-id : 10*******02
344
387
` ` `
345
388
346
- ### 2.3. OAuthProperties .java
389
+ ### 2.3. OauthController .java
347
390
348
391
` ` ` java
349
- /**
350
- * <p>
351
- * 第三方登录配置
352
- * </p>
353
- *
354
- * @package: com.xkcoding.oauth.config.props
355
- * @description: 第三方登录配置
356
- * @author: yangkai.shen
357
- * @date: Created in 2019年05月17日 15:33
358
- * @copyright: Copyright (c) 2019
359
- * @version: V1.0
360
- * @modified: yangkai.shen
361
- */
362
- @Data
363
- @Component
364
- @ConfigurationProperties(prefix = "oauth")
365
- public class OAuthProperties {
366
- /**
367
- * QQ 配置
368
- */
369
- private AuthConfig qq;
370
-
371
- /**
372
- * github 配置
373
- */
374
- private AuthConfig github;
375
-
376
- /**
377
- * 微信 配置
378
- */
379
- private AuthConfig wechat;
380
-
381
- /**
382
- * Google 配置
383
- */
384
- private AuthConfig google;
385
-
386
- /**
387
- * Microsoft 配置
388
- */
389
- private AuthConfig microsoft;
390
-
391
- /**
392
- * Mi 配置
393
- */
394
- private AuthConfig mi;
395
- }
396
- ```
397
-
398
- ### 2.4. OauthController.java
399
-
400
- ``` java
401
- package com.xkcoding.social.controller ;
402
-
403
- import cn.hutool.core.lang.Dict ;
404
- import cn.hutool.json.JSONUtil ;
405
- import com.xkcoding.social.props.OAuthProperties ;
406
- import lombok.RequiredArgsConstructor ;
407
- import lombok.extern.slf4j.Slf4j ;
408
- import me.zhyd.oauth.config.AuthConfig ;
409
- import me.zhyd.oauth.config.AuthSource ;
410
- import me.zhyd.oauth.model.AuthCallback ;
411
- import me.zhyd.oauth.model.AuthResponse ;
412
- import me.zhyd.oauth.request.* ;
413
- import me.zhyd.oauth.utils.AuthStateUtils ;
414
- import org.springframework.beans.factory.annotation.Autowired ;
415
- import org.springframework.web.bind.annotation.GetMapping ;
416
- import org.springframework.web.bind.annotation.PathVariable ;
417
- import org.springframework.web.bind.annotation.RequestMapping ;
418
- import org.springframework.web.bind.annotation.RestController ;
419
-
420
- import javax.servlet.http.HttpServletResponse ;
421
- import java.io.IOException ;
422
-
423
392
/**
424
393
* <p>
425
394
* 第三方登录 Controller
@@ -438,14 +407,15 @@ import java.io.IOException;
438
407
@RequestMapping("/oauth")
439
408
@RequiredArgsConstructor(onConstructor_ = @Autowired)
440
409
public class OauthController {
441
- private final OAuthProperties properties ;
410
+ private final AuthRequestFactory factory ;
442
411
443
412
/**
444
413
* 登录类型
445
414
*/
446
415
@GetMapping
447
- public Dict loginType () {
448
- return Dict . create(). set(" QQ登录" , " http://oauth.xkcoding.com/demo/oauth/login/qq" ). set(" GitHub登录" , " http://oauth.xkcoding.com/demo/oauth/login/github" ). set(" 微信登录" , " http://oauth.xkcoding.com/demo/oauth/login/wechat" ). set(" Google登录" , " http://oauth.xkcoding.com/demo/oauth/login/google" ). set(" Microsoft 登录" , " http://oauth.xkcoding.com/demo/oauth/login/microsoft" ). set(" 小米登录" , " http://oauth.xkcoding.com/demo/oauth/login/mi" );
416
+ public Map<String, String> loginType() {
417
+ List<String> oauthList = factory.oauthList();
418
+ return oauthList.stream().collect(Collectors.toMap(oauth -> oauth.toLowerCase() + "登录", oauth -> "http://oauth.xkcoding.com/demo/oauth/login/" + oauth.toLowerCase()));
449
419
}
450
420
451
421
/**
@@ -457,8 +427,8 @@ public class OauthController {
457
427
*/
458
428
@RequestMapping("/login/{oauthType}")
459
429
public void renderAuth(@PathVariable String oauthType, HttpServletResponse response) throws IOException {
460
- AuthRequest authRequest = getAuthRequest( oauthType);
461
- response. sendRedirect(authRequest. authorize(AuthStateUtils . createState()));
430
+ AuthRequest authRequest = factory.get(getAuthSource( oauthType) );
431
+ response.sendRedirect(authRequest.authorize(oauthType + "::" + AuthStateUtils.createState()));
462
432
}
463
433
464
434
/**
@@ -470,65 +440,26 @@ public class OauthController {
470
440
*/
471
441
@RequestMapping("/{oauthType}/callback")
472
442
public AuthResponse login(@PathVariable String oauthType, AuthCallback callback) {
473
- AuthRequest authRequest = getAuthRequest( oauthType);
443
+ AuthRequest authRequest = factory.get(getAuthSource( oauthType) );
474
444
AuthResponse response = authRequest.login(callback);
475
445
log.info("【response】= {}", JSONUtil.toJsonStr(response));
476
446
return response;
477
447
}
478
448
479
- private AuthRequest getAuthRequest (String oauthType ) {
480
- AuthSource authSource = AuthSource . valueOf(oauthType. toUpperCase());
481
- switch (authSource) {
482
- case QQ :
483
- return getQqAuthRequest();
484
- case GITHUB :
485
- return getGithubAuthRequest();
486
- case WECHAT :
487
- return getWechatAuthRequest();
488
- case GOOGLE :
489
- return getGoogleAuthRequest();
490
- case MICROSOFT :
491
- return getMicrosoftAuthRequest();
492
- case MI :
493
- return getMiAuthRequest();
494
- default :
495
- throw new RuntimeException (" 暂不支持的第三方登录" );
449
+ private AuthSource getAuthSource(String type) {
450
+ if (StrUtil.isNotBlank(type)) {
451
+ return AuthSource.valueOf(type.toUpperCase());
452
+ } else {
453
+ throw new RuntimeException("不支持的类型");
496
454
}
497
455
}
498
-
499
- private AuthRequest getQqAuthRequest () {
500
- AuthConfig authConfig = properties. getQq();
501
- return new AuthQqRequest (authConfig);
502
- }
503
-
504
- private AuthRequest getGithubAuthRequest () {
505
- AuthConfig authConfig = properties. getGithub();
506
- return new AuthGithubRequest (authConfig);
507
- }
508
-
509
- private AuthRequest getWechatAuthRequest () {
510
- AuthConfig authConfig = properties. getWechat();
511
- return new AuthWeChatRequest (authConfig);
512
- }
513
-
514
- private AuthRequest getGoogleAuthRequest () {
515
- AuthConfig authConfig = properties. getGoogle();
516
- return new AuthGoogleRequest (authConfig);
517
- }
518
-
519
- private AuthRequest getMicrosoftAuthRequest () {
520
- AuthConfig authConfig = properties. getMicrosoft();
521
- return new AuthMicrosoftRequest (authConfig);
522
- }
523
-
524
- private AuthRequest getMiAuthRequest () {
525
- AuthConfig authConfig = properties. getMi();
526
- return new AuthMiRequest (authConfig);
527
- }
528
456
}
529
-
530
457
```
531
458
459
+ ### 2.4. 如果想要自定义 state 缓存
460
+
461
+ 请看👉[ 这里] ( https://github.com/xkcoding/spring-boot-demo/tree/master/spring-boot-demo-social/src/main/java/com/xkcoding/social/config/justauth )
462
+
532
463
## 3. 运行方式
533
464
534
465
打开浏览器,输入 http://oauth.xkcoding.com/demo/oauth ,点击各个登录方式自行测试。
@@ -539,16 +470,17 @@ public class OauthController {
539
470
540
471
## 参考
541
472
542
- 1 . JustAuth 项目地址:https://github.com/zhangyd-c/JustAuth
543
- 2 . frp内网穿透项目地址:https://github.com/fatedier/frp
544
- 3 . frp内网穿透官方中文文档:https://github.com/fatedier/frp/blob/master/README_zh.md
545
- 4 . Frp实现内网穿透:https://zhuanlan.zhihu.com/p/45445979
546
- 5 . QQ互联文档:http://wiki.connect.qq.com/%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C_oauth2-0
547
- 6 . 微信开放平台文档:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN
548
- 7 . GitHub第三方登录文档:https://developer.github.com/apps/building-oauth-apps/
549
- 8 . 谷歌Oauth2文档:https://developers.google.com/identity/protocols/OpenIDConnect
550
- 9 . 微软Oauth2文档:https://docs.microsoft.com/zh-cn/graph/auth-v2-user
551
- 10 . 小米开放平台账号服务文档:https://dev.mi.com/console/doc/detail?pId=707
473
+ 1 . JustAuth 项目地址:https://github.com/justauth/JustAuth
474
+ 2 . justauth-spring-boot-starter 地址:https://github.com/justauth/justauth-spring-boot-starter
475
+ 3 . frp内网穿透项目地址:https://github.com/fatedier/frp
476
+ 4 . frp内网穿透官方中文文档:https://github.com/fatedier/frp/blob/master/README_zh.md
477
+ 5 . Frp实现内网穿透:https://zhuanlan.zhihu.com/p/45445979
478
+ 6 . QQ互联文档:http://wiki.connect.qq.com/%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C_oauth2-0
479
+ 7 . 微信开放平台文档:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN
480
+ 8 . GitHub第三方登录文档:https://developer.github.com/apps/building-oauth-apps/
481
+ 9 . 谷歌Oauth2文档:https://developers.google.com/identity/protocols/OpenIDConnect
482
+ 10 . 微软Oauth2文档:https://docs.microsoft.com/zh-cn/graph/auth-v2-user
483
+ 11 . 小米开放平台账号服务文档:https://dev.mi.com/console/doc/detail?pId=707
552
484
553
485
554
486
0 commit comments