https://xkcoding.com/2019/05/22/spring-boot-login-with-oauth.html
此 demo 主要演示 Spring Boot 项目如何使用 史上最全的第三方登录工具 - JustAuth(https://github.com/zhangyd-c/JustAuth) 实现第三方登录。
如果技术选型是
JFinal
的,请查看此demo(
https://github.com/xkcoding/jfinal-justauth-demo)
https://github.com/xkcoding/jfinal-justauth-demo
JustAuth,如你所见,它仅仅是一个第三方授权登录的工具类库,它可以让我们脱离繁琐的第三方登录 SDK,让登录变得So easy!
- 全:已集成十多家第三方平台(国内外常用的基本都已包含),后续依然还有扩展计划!
- 简:API 就是奔着最简单去设计的(见后面
快速开始
),尽量让您用起来没有障碍感!(https://github.com/zhangyd-c/JustAuth#%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B)PS: 本人十分幸运的参与到了这个 SDK 的开发,主要开发了 QQ 登录、微信登录、小米登录、微软登录、谷歌登录这
5
个第三方登录,以及一些 BUG 的修复工作。再次感谢 @母狼 开源这个又好用又全面的第三方登录 SDK。
首先准备一台有公网 IP 的服务器,可以选用阿里云或者腾讯云,如果选用的是阿里云的,可以使用我的优惠链接购买。
frp 安装程序:https://github.com/fatedier/frp/releases
1.2.1. frp 服务端搭建
服务端搭建在上一步准备的公网服务器上,因为服务器是 centos7 x64 的系统,因此,这里下载安装包版本为 linux_amd64 的 frp_0.27.0_linux_amd64.tar.gz 。
下载安装包
$ wget https://github.com/fatedier/frp/releases/download/v0.27.0/frp_0.27.0_linux_amd64.tar.gz
解压安装包
$ tar -zxvf frp_0.27.0_linux_amd64.tar.gz
修改配置文件
$ cd frp_0.27.0_linux_amd64 $ vim frps.ini [common] bind_port = 7100 vhost_http_port = 7200
启动 frp 服务端
1 2 3 4 |
$ ./frps -c frps.ini 2019/06/15 16:42:02 [I] [service.go:139] frps tcp listen on 0.0.0.0:7100 2019/06/15 16:42:02 [I] [service.go:181] http service listen on 0.0.0.0:7200 2019/06/15 16:42:02 [I] [root.go:204] Start frps success |
1.2.2. frp 客户端搭建
客户端搭建在本地的 Mac 上,因此下载安装包版本为 darwin_amd64 的 frp_0.27.0_darwin_amd64.tar.gz 。
下载安装包
$ wget https://github.com/fatedier/frp/releases/download/v0.27.0/frp_0.27.0_darwin_amd64.tar.gz
解压安装包
$ tar -zxvf frp_0.27.0_darwin_amd64.tar.gz
修改配置文件,配置服务端 ip 端口及监听的域名信息
$ cd frp_0.27.0_darwin_amd64 $ vim frpc.ini [common] server_addr = 120.92.169.103 server_port = 7100 [web] type = http local_port = 8080 custom_domains = oauth.xkcoding.com
启动 frp 客户端
1 2 3 4 |
$ ./frpc -c frpc.ini 2019/06/15 16:48:52 [I] [service.go:221] login to server success, get run id [8bb83bae5c58afe6], server udp port [0] 2019/06/15 16:48:52 [I] [proxy_manager.go:137] [8bb83bae5c58afe6] proxy added: [web] 2019/06/15 16:48:52 [I] [control.go:144] [web] start proxy success |
前往阿里云 DNS 解析,将域名解析到我们的公网服务器上,比如我的就是将 oauth.xkcoding.com -> 120.92.169.103
nginx 的搭建就不在此赘述了,只说配置
server {
listen 80;
server_name oauth.xkcoding.com;
location / {
proxy_pass http://127.0.0.1:7200;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_buffering off;
sendfile off;
proxy_max_temp_file_size 0;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_temp_file_write_size 64k;
proxy_http_version 1.1;
proxy_request_buffering off;
}
}
测试配置文件是否有问题
$ nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
重新加载配置文件,使其生效
$ nginx -s reload
现在当我们在浏览器输入 oauth.xkcoding.com
的时候,网络流量其实会经历以下几个步骤:
120.92.169.103
的 80 端口1.5.1. QQ 互联平台申请
1.5.2. GitHub 平台申请
1.5.3 微信开放平台申请
这里微信开放平台需要用企业的,个人没有资质,所以我在某宝租了一个月的资质,需要的可以 戳我租赁
声明:本人与该店铺无利益相关,纯属个人觉得好用做分享
该店铺有两种方式:
- 店铺支持帮你过企业资质,这里就用你自己的开放平台号就好了
- 临时使用可以问店家租一个月进行开发,这里租了之后,店家会把 AppID 和 AppSecret 的信息发给你,你提供回调域就好了
因此这里我就贴出一张授权回调的地址作参考。
1.5.4. 谷歌开放平台申请
前往 https://console.developers.google.com/projectcreate 创建项目
前往 https://console.developers.google.com/apis/credentials ,在第一步创建的项目下,添加应用
1.5.5. 微软开放平台申请
前往 https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade 注册应用
在注册应用的时候就需要填写回调地址,当然后期也可以重新修改
client id 在这里
client secret 需要自己在这里生成
1.5.6. 小米开放平台申请
申请小米开发者,审核通过
前往 https://dev.mi.com/passport/oauth2/applist 添加 oauth 应用,选择 创建网页应用
填写基本信息之后,进入应用信息页面填写 回调地址
应用审核通过之后,可以在应用信息页面的 应用详情
查看到 AppKey 和 AppSecret,吐槽下,小米应用的审核速度特别慢,需要耐心等待。。。。
代码地址:https://github.com/xkcoding/spring-boot-demo/tree/master/spring-boot-demo-social
4.0.0
spring-boot-demo-social
1.0.0-SNAPSHOT
jar
spring-boot-demo-social
Demo project for Spring Boot
com.xkcoding
spring-boot-demo
1.0.0-SNAPSHOT
UTF-8
UTF-8
1.8
1.1.6.RELEASE
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
me.zhyd.oauth
JustAuth
1.8.1
org.projectlombok
lombok
true
com.google.guava
guava
cn.hutool
hutool-all
spring-boot-demo-social
org.springframework.boot
spring-boot-maven-plugin
server:
port: 8080
servlet:
context-path: /demo
oauth:
qq:
client-id: 1015*****
client-secret: 1f7d08df55766**************
redirect-uri: http://oauth.xkcoding.com/demo/oauth/qq/callback
github:
client-id: 2d25a70**************
client-secret: 5a2919b5fe911567343**************
redirect-uri: http://oauth.xkcoding.com/demo/oauth/github/callback
wechat:
client-id: wxdcb31**************
client-secret: b4e9dc6841ef7d**************
redirect-uri: http://oauth.xkcoding.com/demo/oauth/wechat/callback
google:
client-id: 716518501517-6dbdkapivhia806vqcjjh9nttj3**************
client-secret: 9IBornd7w1A**************
redirect-uri: http://oauth.xkcoding.com/demo/oauth/google/callback
microsoft:
client-id: 7bdce818-2c8e-4b**************
client-secret: Iu0zZ43RQydo_FkD**************
redirect-uri: https://oauth.xkcoding.com/demo/oauth/microsoft/callback
mi:
client-id: 2882303**************
client-secret: nFeTt89Yn**************
redirect-uri: http://oauth.xkcoding.com/demo/oauth/mi/callback
/**
*
* 第三方登录配置
*
*
* @package: com.xkcoding.oauth.config.props
* @description: 第三方登录配置
* @author: yangkai.shen
* @date: Created in 2019-05-17 15:33
* @copyright: Copyright (c) 2019
* @version: V1.0
* @modified: yangkai.shen
*/
@Data
@Component
@ConfigurationProperties(prefix = "oauth")
public class OAuthProperties {
/**
* QQ 配置
*/
private AuthConfig qq;
/**
* github 配置
*/
private AuthConfig github;
/**
* 微信 配置
*/
private AuthConfig wechat;
/**
* Google 配置
*/
private AuthConfig google;
/**
* Microsoft 配置
*/
private AuthConfig microsoft;
/**
* Mi 配置
*/
private AuthConfig mi;
}
/**
*
* 第三方登录 Controller
*
*
* @package: com.xkcoding.oauth.controller
* @description: 第三方登录 Controller
* @author: yangkai.shen
* @date: Created in 2019-05-17 10:07
* @copyright: Copyright (c) 2019
* @version: V1.0
* @modified: yangkai.shen
*/
@RestController
@RequestMapping("/oauth")
@RequiredArgsConstructor(onConstructor_ = @Autowired)
public class OauthController {
private final OAuthProperties properties;
/**
* 登录类型
*/
@GetMapping
public Dict loginType() {
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");
}
/**
* 登录
*
* @param oauthType 第三方登录类型
* @param response response
* @throws IOException
*/
@RequestMapping("/login/{oauthType}")
public void renderAuth(@PathVariable String oauthType, HttpServletResponse response) throws IOException {
AuthRequest authRequest = getAuthRequest(oauthType);
response.sendRedirect(authRequest.authorize());
}
/**
* 登录成功后的回调
*
* @param oauthType 第三方登录类型
* @param callback 携带返回的信息
* @return 登录成功后的信息
*/
@RequestMapping("/{oauthType}/callback")
public AuthResponse login(@PathVariable String oauthType, AuthCallback callback) {
AuthRequest authRequest = getAuthRequest(oauthType);
AuthResponse response = authRequest.login(callback);
// 移除校验通过的state
AuthState.delete(oauthType);
return response;
}
private AuthRequest getAuthRequest(String oauthType) {
AuthSource authSource = AuthSource.valueOf(oauthType.toUpperCase());
String state = AuthState.create(oauthType);
switch (authSource) {
case QQ:
return getQqAuthRequest(state);
case GITHUB:
return getGithubAuthRequest(state);
case WECHAT:
return getWechatAuthRequest(state);
case GOOGLE:
return getGoogleAuthRequest(state);
case MICROSOFT:
return getMicrosoftAuthRequest(state);
case MI:
return getMiAuthRequest(state);
default:
throw new RuntimeException("暂不支持的第三方登录");
}
}
private AuthRequest getQqAuthRequest(String state) {
AuthConfig authConfig = properties.getQq();
authConfig.setState(state);
return new AuthQqRequest(authConfig);
}
private AuthRequest getGithubAuthRequest(String state) {
AuthConfig authConfig = properties.getGithub();
authConfig.setState(state);
return new AuthGithubRequest(authConfig);
}
private AuthRequest getWechatAuthRequest(String state) {
AuthConfig authConfig = properties.getWechat();
authConfig.setState(state);
return new AuthWeChatRequest(authConfig);
}
private AuthRequest getGoogleAuthRequest(String state) {
AuthConfig authConfig = properties.getGoogle();
authConfig.setState(state);
return new AuthGoogleRequest(authConfig);
}
private AuthRequest getMicrosoftAuthRequest(String state) {
AuthConfig authConfig = properties.getMicrosoft();
authConfig.setState(state);
return new AuthMicrosoftRequest(authConfig);
}
private AuthRequest getMiAuthRequest(String state) {
AuthConfig authConfig = properties.getMi();
authConfig.setState(state);
return new AuthMiRequest(authConfig);
}
}
打开浏览器,输入 http://oauth.xkcoding.com/demo/oauth ,点击各个登录方式自行测试。
Google 登录,有可能因为祖国的强大导致测试失败,自行解决~
:kissing_smiling_eyes: