2019-09-17 18:38:35 +08:00
# 如何使用
2019-08-23 20:05:26 +08:00
在前面有介绍到,JustAuth的特点之一就是**简**,极简主义,不给使用者造成不必要的障碍。
2019-08-03 14:35:51 +08:00
2019-08-23 20:05:26 +08:00
既然牛皮吹下了, 那么如何才能用JustAuth实现第三方登录呢?
2019-09-17 18:38:35 +08:00
## 使用步骤
2019-09-03 20:39:19 +08:00
使用JustAuth总共分三步(**这三步也适合于JustAuth支持的任何一个平台**):
2019-08-23 20:05:26 +08:00
1. 申请注册第三方平台的开发者账号
2019-09-03 20:39:19 +08:00
2. 创建第三方平台的应用,获取配置信息(`accessKey` , `secretKey` , `redirectUri` )
2019-08-23 20:05:26 +08:00
3. 使用该工具实现授权登陆
2019-09-17 18:38:35 +08:00
## 使用方式
2019-08-23 20:05:26 +08:00
- 引入依赖
``` xml
<dependency >
<groupId > me.zhyd.oauth</groupId>
<artifactId > JustAuth</artifactId>
2019-09-03 20:39:19 +08:00
<version > ${latest.version}</version>
2019-08-23 20:05:26 +08:00
</dependency>
```
- 调用api
``` java
// 创建授权request
AuthRequest authRequest = new AuthGiteeRequest ( AuthConfig . builder ( )
. clientId ( " clientId " )
. clientSecret ( " clientSecret " )
. redirectUri ( " redirectUri " )
. build ( ) ) ;
// 生成授权页面
2019-09-03 09:14:50 +08:00
authRequest . authorize ( " state " ) ;
2019-08-23 20:05:26 +08:00
// 授权登录后会返回code(auth_code(仅限支付宝))、state, 1.8.0版本后,可以用AuthCallback类作为回调接口的参数
// 注:JustAuth默认保存state的时效为3分钟,3分钟内未使用则会自动清除过期的state
authRequest . login ( callback ) ;
2019-09-17 18:38:35 +08:00
```
## API分解
**JustAuth**的核心就是一个个的`request` ,每个平台都对应一个具体的`request` 类,所以在使用之前,需要就具体的授权平台创建响应的`request`
``` java
// 创建授权request
AuthRequest authRequest = new AuthGiteeRequest ( AuthConfig . builder ( )
. clientId ( " clientId " )
. clientSecret ( " clientSecret " )
. redirectUri ( " redirectUri " )
. build ( ) ) ;
```
所有可用的`Request` 列表请参考:[已集成的平台 ](https://docs.justauth.whnb.wang/#/README?id=已集成的平台 )
### 获取授权链接
``` java
String authorizeUrl = authRequest . authorize ( " state " ) ;
```
获取到`authorizeUrl` 后,可以手动实现redirect到`authorizeUrl` 上
**伪代码 **
``` java
/**
*
* @param source 第三方授权平台,以本例为参考,该值为gitee(因为上面声明的AuthGiteeRequest)
*/
@RequestMapping ( " /render/{source} " )
public void renderAuth ( @PathVariable ( " source " ) String source , HttpServletResponse response ) throws IOException {
AuthRequest authRequest = getAuthRequest ( source ) ;
String authorizeUrl = authRequest . authorize ( AuthStateUtils . createState ( ) ) ;
response . sendRedirect ( authorizeUrl ) ;
}
```
注:`state` 建议必传!`state` 在`OAuth` 的流程中的主要作用就是保证请求完整性,防止**CSRF**风险,此处传的`state` 将在回调时传回
### 登录(获取用户信息)
``` java
AuthResponse response = authRequest . login ( callback ) ;
```
授权登录后会返回code(auth_code(仅限支付宝)、authorization_code(仅限华为))、state, 1.8.0版本后,用`AuthCallback` 类作为回调接口的入参
**伪代码 **
``` java
/**
*
* @param source 第三方授权平台,以本例为参考,该值为gitee(因为上面声明的AuthGiteeRequest)
*/
@RequestMapping ( " /callback/{source} " )
public Object login ( @PathVariable ( " source " ) String source , AuthCallback callback ) {
AuthRequest authRequest = getAuthRequest ( source ) ;
AuthResponse response = authRequest . login ( callback ) ;
return response ;
}
```
**注:第三方平台中配置的授权回调地址,以本文为例,在创建授权应用时的回调地址应为:`[host]/callback/gitee` **
### 刷新token
注:`refresh` 功能,并不是每个平台都支持
``` java
AuthResponse response = authRequest . refresh ( AuthToken . builder ( ) . refreshToken ( token ) . build ( ) ) ;
```
**伪代码 **
``` java
/**
*
* @param source 第三方授权平台,以本例为参考,该值为gitee(因为上面声明的AuthGiteeRequest)
* @param token login成功后返回的refreshToken
*/
@RequestMapping ( " /refresh/{source} " )
public Object refreshAuth ( @PathVariable ( " source " ) String source , String token ) {
AuthRequest authRequest = getAuthRequest ( source ) ;
return authRequest . refresh ( AuthToken . builder ( ) . refreshToken ( token ) . build ( ) ) ;
}
```
### 取消授权
注:`revoke` 功能,并不是每个平台都支持
``` java
AuthResponse response = authRequest . revoke ( AuthToken . builder ( ) . accessToken ( token ) . build ( ) ) ;
```
**伪代码 **
``` java
/**
*
* @param source 第三方授权平台,以本例为参考,该值为gitee(因为上面声明的AuthGiteeRequest)
* @param token login成功后返回的accessToken
*/
@RequestMapping ( " /revoke/{source}/{token} " )
public Object revokeAuth ( @PathVariable ( " source " ) String source , @PathVariable ( " token " ) String token ) throws IOException {
AuthRequest authRequest = getAuthRequest ( source ) ;
return authRequest . revoke ( AuthToken . builder ( ) . accessToken ( token ) . build ( ) ) ;
}
2019-09-20 19:33:52 +08:00
```
## 参考文章
- [实现Gitee授权登录 ](http://t.cn/ExDKxQs )
- [实现Github授权登录 ](http://t.cn/EJ0Fxqo )
- [Spring Boot 快速集成第三方登录功能 ](http://t.cn/AiWWx5kH ) : QQ、Github、微信、谷歌、微软、小米、企业微信
- [集成企业微信 ](https://mp.weixin.qq.com/s?__biz=MzA3NDk3OTIwMg==&mid=2450633170&idx=2&sn=456b70742a86948a193c691f3e47b72e&chksm=8892933fbfe51a29c1da386a2252d4bf91bfbd14e1ac0b99b783763a0d12e2e4b2d7c4369933&token=482455242&lang=zh_CN#rd )
2019-10-26 17:41:59 +08:00
## 配套项目
**配套Demo ** :
- [JustAuth-demo ](https://github.com/justauth/JustAuth-demo ):普通版springboot项目demo
- [jFinal版 ](https://github.com/xkcoding/jfinal-justauth-demo ): Jfinal集成JustAuth的demo by [xkcoding ](https://github.com/xkcoding )
- [ActFramework版 ](https://github.com/xkcoding/act-justauth-demo ): ActFramework 集成 JustAuth 的 demo by [xkcoding ](https://github.com/xkcoding )
- [Nutzboot版 ](https://github.com/EggsBlue/nutzboot-justauth-demo ): NutzBoot集成JustAuth的demo by [蛋蛋 ](https://github.com/EggsBlue )
- [Blade版 ](https://github.com/justauth/blade-justauth-demo ): Blade集成JustAuth的demo
## springboot starter插件
- [justauth-spring-boot-starter ](https://github.com/xkcoding/justauth-spring-boot-starter ): Spring Boot 集成 JustAuth 的最佳实践 by [xkcoding ](https://github.com/xkcoding )
- [justauth-spring-boot-starter-demo ](https://github.com/justauth/justauth-spring-boot-starter-demo ): Spring Boot 使用 justauth-spring-boot-starter 快速集成 JustAuth by [xkcoding ](https://github.com/xkcoding )