一、项目介绍
JustAuth,如你所见,它仅仅是一个第三方授权登录的工具类库,它可以让我们脱离繁琐的第三方登录 SDK,让登录变得So easy!
JustAuth 集成了诸如:Github、Gitee、支付宝、新浪微博、微信、Google、Facebook、Twitter、StackOverflow等国内外数十家第三方平台
二、项目特点
全 :已集成十多家第三方平台(国内外常用的基本都已包含),仍然还在持续扩展中(开发计划)! 简 :API就是奔着最简单去设计的(见后面快速开始),尽量让您用起来没有障碍感!
三、项目功能
-
集成国内外数十家第三方平台,实现快速接入
-
自定义 State 缓存,支持各种分布式缓存组件。
-
自定义 OAuth 平台,更容易适配自有的 OAuth 服务。
-
自定义 Http 实现,选择权完全交给开发者,不会单独依赖某一具体实现。
-
自定义 Scope,支持更完善的授权体系。
四、OAuth流程
参与的角色
-
资源所有者,即代表授权客户端访问本身资源信息的用户(User),也就是应用场景中的"开发者A"
-
资源服务器,托管受保护的用户账号信息,比如Github
-
授权服务器,验证用户身份然后为客户端派发资源访问令牌,比如Github
-
可以是同一台服务器,也可以是不同的服务器,视具体的授权平台而有所差异
-
客户端,即代表意图访问受限资源的第三方应用
授权流程
流程解析
-
(A) 用户打开客户端以后,客户端要求用户给予授权。
-
(B) 用户同意给予客户端授权。
-
(C) 客户端使用上一步获得的授权,向认证服务器申请令牌。
-
(D) 认证服务器对客户端进行认证以后,确认无误,同意发放令牌
-
(E) 客户端使用令牌,向资源服务器申请获取资源。
-
(F) 资源服务器确认令牌无误,同意向客户端开放资源。
授权许可 Authorization Grant
-
Authorization Code
- 结合普通服务器端应用使用(web端常用的授权方式)
-
Implicit
- 结合移动应用或 Web App 使用
-
Resource Owner Password Credentials
- 适用于受信任客户端应用,例如同个组织的内部或外部应用
-
Client Credentials
- 适用于客户端调用主服务API型应用(比如百度API Store)
直白话 OAuth 2 流程
以上流程理解起来可能有些难度,这儿我们给出一个白话版的流程图 首先引入三个角色:
-
用户A:可以理解成你自己
-
网站B:可以理解成 OSChina
-
第三方C:可以理解成 Github
需求:你(用户A)想通过 Github(第三方C) 登录网站B(OSChina)。
五、如何使用
使用步骤
使用JustAuth总共分三步(这三步也适合于JustAuth支持的任何一个平台):
-
申请注册第三方平台的开发者账号
-
创建第三方平台的应用,获取配置信息(
accessKey
,secretKey
,redirectUri
) -
使用该工具实现授权登陆
使用方式
-
引入依赖
<dependency> <groupId>me.zhyd.oauth</groupId> <artifactId>JustAuth</artifactId> <version>{latest-version}</version> </dependency>
-
如下任选一种 HTTP 工具 依赖,项目内如果已有,请忽略。另外需要特别注意,如果项目中已经引入了低版本的依赖,请先排除低版本依赖后,再引入高版本或者最新版本的依赖
-
hutool-http
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-http</artifactId> <version>5.7.7</version> </dependency>
-
httpclient
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency>
-
okhttp
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.1</version> </dependency>
调用api
普通方式
// 创建授权request
AuthRequest authRequest = new AuthGiteeRequest(AuthConfig.builder()
.clientId("clientId")
.clientSecret("clientSecret")
.redirectUri("redirectUri")
.build());
// 生成授权页面
authRequest.authorize("state");
// 授权登录后会返回code(auth_code(仅限支付宝))、state,1.8.0版本后,可以用AuthCallback类作为回调接口的参数
// 注:JustAuth默认保存state的时效为3分钟,3分钟内未使用则会自动清除过期的state
authRequest.login(callback);
Builder 方式一
静态配置 AuthConfig
AuthRequest authRequest = AuthRequestBuilder.builder()
.source("github")
.authConfig(AuthConfig.builder()
.clientId("clientId")
.clientSecret("clientSecret")
.redirectUri("redirectUri")
.build())
.build();
// 生成授权页面
authRequest.authorize("state");
// 授权登录后会返回code(auth_code(仅限支付宝))、state,1.8.0版本后,可以用AuthCallback类作为回调接口的参数
// 注:JustAuth默认保存state的时效为3分钟,3分钟内未使用则会自动清除过期的state
authRequest.login(callback);
Builder 方式二
动态获取并配置 AuthConfig
AuthRequest authRequest = AuthRequestBuilder.builder()
.source("gitee")
.authConfig((source) -> {
// 通过 source 动态获取 AuthConfig
// 此处可以灵活的从 sql 中取配置也可以从配置文件中取配置
return AuthConfig.builder()
.clientId("clientId")
.clientSecret("clientSecret")
.redirectUri("redirectUri")
.build();
})
.build();
Assert.assertTrue(authRequest instanceof AuthGiteeRequest);
System.out.println(authRequest.authorize(AuthStateUtils.createState()));
Builder 方式支持自定义的平台
AuthRequest authRequest = AuthRequestBuilder.builder()
// 关键点:将自定义实现的 AuthSource 配置上
.extendSource(AuthExtendSource.values())
// source 对应 AuthExtendSource 中的枚举 name
.source("other")
// ... 其他内容不变,参考上面的示例
.build();
六、使用参考文档
https://www.justauth.cn/
源代码下载地址:
https://gitee.com/yadong.zhang/JustAuth.git
看到最后,如果这个项目对你有用,一定要给我点个"在看和赞"。