第三方平台授权登录,这在互联网产品的开发中是再常见不过的需求了。基于OAuth 2 的授权模式,使得可以更为方便地打通不同平台的用户授权验证,大大提升了用户的使用体验。然而,提供了第三方登录授权的平台五花八门,在实现第三方登录时往往需要同时实现多个不同平台,而提供了接口和授权方式又并不统一,逐一阅读开发文档去实现,耗时耗力。JustAuth,提供了号称史上最全的第三方登录,使得开发者可以为应用快速添加第三方登录功能。
JustAuth - 第三方登录
JustAuth 是 justauth 组织在 Github 上开源的第三方登录开源库,项目位于 https://github.com/justauth/JustAuth,同时也在 Gitee 开源,位于 https://gitee.com/yadong.zhang/JustAuth,目前版本为 v1.15.6。
JustAuth 是一个第三方授权登录的 Java 工具类库,可以使开发者脱离繁琐的第三方登录SDK,使登录变得更为简单。JustAuth 十分全面,已经集成了数十家第三方平台,包括:Github、Gitee、微博、钉钉、百度、Coding、腾讯云、OSChina、支付宝、QQ、微信、淘宝、Google、Facebook、抖音、领英、小米、微软、今日头条、Teambition、StackOverflow、Pinterest、人人、华为、企业微信、酷家乐、Gitlab、美团、饿了么和推特等。同时,接口设计十分简单,上手十分轻松。JustAuth 支持自定义 State 缓存,支持各种分布式缓存组件;支持自定义 OAuth 平台,更容易适配自有的 OAuth 服务;支持自定义 HTTP 实现,不依赖单一的具体实现;支持自定义 Scope,支持更完善的授权体系等。
JustAuth官方网站
JustAuth 使用 Java 开发,可以引入 JustAuth 依赖:
<dependency>
<groupId>me.zhyd.oauth</groupId>
<artifactId>JustAuth</artifactId>
<version>${latest.version}</version>
</dependency>
JustAuth 默认集成 simple-http 作为 HTTP 通用接口。若项目内没有集成 HTTP 实现工具,需要自行添加对应的 HTTP 实现类,可以使用包括:hutool-http:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-http</artifactId>
<version>5.3.9</version>
</dependency>
httpclient,
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</dependency>
以及 okhttp:
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.8.0</version>
</dependency>
JustAuth Github
第三方登录使用的是 OAuth 2 模式,授权流程参与的角色包括:
整个授权的流程如下:
OAuth2流程
对于JustAuth 而言,其核心就是每个平台所对应的一个个具体的 request 类,在进行授权之前,需要就具体的平台创建对应的 request 实例:
// 创建授权request
AuthRequest authRequest = new AuthGiteeRequest(AuthConfig.builder()
.clientId("clientId")
.clientSecret("clientSecret")
.redirectUri("redirectUri")
.build());
在这个例子中,针对 Gitee 平台,使用 AuthGiteeReques 类,并配置在该平台的的开发者账号,包括 clientId,clientSecret,和 redirectUri。然后,就可以调用 authRequest 的 authorize 接口,获取对应的授权链接:
String authorizeUrl = authRequest.authorize("state");
获取授权链接后,可以进行手动重定向。一个简单的重定向回调实例如下:
/**
*
* @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);
}
从当前页面,跳转到第三方平台的授权验证页面,并携带当前状态信息。
当用户完成了第三方平台的授权后,授权登录会返回 code,并调用回调:
AuthResponse response = authRequest.login(callback);
一个简单的回调接口可以这样实现:
/**
*
* @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;
}
通过给 AuthRequest 的 login 接口提供一个 AuthCallback,实现授权码的回调。
另外,对于支持刷新 token 的平台,可以使用 refresh 接口进行 token 的刷新:
/**
*
* @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 实现:
/**
*
* @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());
}
JustAuth 对于各平台提供了统一的接口,使得多平台的授权登录的实现变得十分简单。同时,JustAuth 也在文档提供了不同平台的开发应用申请等具体流程,并提供了接口测试的平台,上手十分容易。
JustAuth登录测试平台
JustAuth 作为一个第三方登录组件库,提供了极为全面的平台支持,基本满足了第三方登录的日常需求,省去了重复阅读不同平台的 SDK 文档,和对接实现的麻烦,使用统一的接口,隐去了不同平台接口令人头疼的差异,使得第三方授权变得十分清晰明了,很方便地就能整合到业务应用中,大大提升了开发效率。同时,JustAuth 也提供了对于自定义平台验证的支持,使得其具备极强的可扩展性,可以适用于各种各样的业务场景,十分值得尝试。
作者:每日开源代码 来源:https://www.toutiao.com/a6866466629929140744/