JustAuth介绍
JustAuth
开箱即用的整合第三方登录的开源组件
__丰富的 OAuth 平台__
支持国内外数十家知名的第三方平台的 OAuth 登录。
__自定义 state__
支持自定义 State 和缓存方式,开发者可根据实际情况选择任意缓存插件。
__自定义 OAuth__
提供统一接口,支持接入任意 OAuth 网站,快速实现 OAuth 登录功能。
__自定义 Http__
接口 HTTP 工具,开发者可以根据自己项目的实际情况选择相对应的HTTP工具。
__自定义 Scope__
支持自定义 scope,以适配更多的业务场景,而不仅仅是为了登录。
__代码规范·简单__
JustAuth 代码严格遵守阿里巴巴编码规约,结构清晰、逻辑简单。
JustAuthPlus
一款开源的登录认证中间件,支持 Form、 OAuth2.0、OIDC、Http(Basic、Digest、Bearer)、LDAP、SAML、MFA、SSO 等
__OAuth 2.0 Server__
基于 RFC6749、RFC7636、RFC7033等标准协议和 OpenID Connect Core 1.0 认证协议,自研的一款轻量级、业务解耦、开箱即用的新一代国产授权认证框架。
__OAuth 2.0 协议登录__
支持标准的 OAuth 2.0 协议登录,支持授权码模式、隐式授权模式、密码模式、客户端模式以及在授权码模式之上的 PKCE 模式。
__OIDC 协议登录__
支持标准的 OpenID Connect Core 1.0 协议登录,支持多种 response\_type,如:code、code token、code id\_token、token、id\_token、token id\_token 等
__社会化平台登录__
基于 JustAuth,支持国内外数十家知名的第三方平台的第三方登录。
__LDAP 登录__
支持使用 LDAP 中的用户进行身份认证,适配 LDAP 中所有标准密码加密类型。
__单点登录__
内置单点登录功能,一点登录,处处通行。
__账号密码登录__
支持本地系统账号密码的登录,支持“记住我”。
__API 登录__
支持 Basic、Digest 和 Bearer 等方式
__多因素认证(MFA)__
支持 TOTP、手机验证码、邮箱验证码等多因素认证。
__SAML 登录__
支持 SAML 协议的登录认证
__模块化开发__
基于模块化设计、开发,针对每一种登录场景,比如账号密码、OAuth、OIDC等,都单独提供了独有的模块化解决方案。
__多种语言支持__
支持多种语言的 SDK,如:Java、NodeJS、Python、PHP、GO等。
开发
- 在企业微信后台中添加应用
配置回调域
- 记录下应用的相关信息,在后文要用到
- 创建一个 SpringBoot 项目
- 添加 jap-social 依赖
implementation 'com.fujieid:jap-social:1.0.7'
- 创建接口 JapUserService 的实现类 JapUserServiceImpl
package com.liziyi0914.learnjustauth;
import com.fujieid.jap.core.JapUser; import com.fujieid.jap.core.JapUserService; import me.zhyd.oauth.model.AuthUser; import org.springframework.stereotype.Service;
@Service public class JapUserServiceImpl implements JapUserService {
<span class="hljs-comment">/** * 根据第三方平台标识(platform)和第三方平台的用户 uid 查询数据库 * * <span class="hljs-doctag">@param</span> platform 第三方平台标识 * <span class="hljs-doctag">@param</span> uid 第三方平台的用户 uid * <span class="hljs-doctag">@return</span> JapUser */</span> <span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword">public</span> JapUser <span class="hljs-title">getByPlatformAndUid</span><span class="hljs-params">(String platform, String uid)</span> </span>{ <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>; } <span class="hljs-comment">/** * 创建并获取第三方用户,相当于第三方登录成功后,将授权 关 系保存到数据库(开发者业务系统中 social user -> sys user 的绑定关系) * * <span class="hljs-doctag">@param</span> userInfo JustAuth 中的 AuthUser * <span class="hljs-doctag">@return</span> JapUser */</span> <span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword">public</span> JapUser <span class="hljs-title">createAndGetSocialUser</span><span class="hljs-params">(Object userInfo)</span> </span>{ AuthUser authUser = (AuthUser) userInfo; <span class="hljs-comment">// 查询绑定关系,确定当前用户是否已经登录过业务系统</span> JapUser japUser = <span class="hljs-keyword">this</span>.getByPlatformAndUid(authUser.getSource(), authUser.getUuid()); <span class="hljs-keyword">if</span> (<span class="hljs-keyword">null</span> == japUser) { <span class="hljs-comment">// 添加用户</span> japUser = <span class="hljs-keyword">new</span> JapUser(); japUser.setUserId(authUser.getUuid()); japUser.setUsername(authUser.getUsername()) ; japUser.setAdditional(authUser); } <span class="hljs-keyword">return</span> japUser; }
}
- 创建控制器
package com.liziyi0914.learnjustauth;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fujieid.jap.core.JapUserService; import com.fujieid.jap.core.config.JapConfig; import com.fujieid.jap.core.result.JapResponse; import com.fujieid.jap.http.adapter.jakarta.JakartaRequestAdapter; import com.fujieid.jap.http.adapter.jakarta.JakartaResponseAdapter; import com.fujieid.jap.social.SocialConfig; import com.fujieid.jap.social.SocialStrategy; import me.zhyd.oauth.config.AuthConfig; import me.zhyd.oauth.utils.UuidUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;
@RestController @RequestMapping("/auth") public class AuthController {
<span class="hljs-meta">@Autowired</span> ObjectMapper mapper; <span class="hljs-meta">@Autowired</span> JapUserService japUserService; <span class="hljs-meta">@GetMapping</span>(<span class="hljs-string">"/login"</span>) <span class="hljs-function"><span class="hljs-keyword">public</span> Object <span class="hljs-title">login</span><span class="hljs-params">(HttpServletRequest request, HttpServletResponse response)</span> </span>{ SocialStrategy socialStrategy = <span class="hljs-keyword">new</span> SocialStrategy(japUserService, <span class="hljs-keyword">new</span> JapConfig()); SocialConfig config = <span class="hljs-keyword">new</span> SocialConfig(); config.setPlatform(<span class="hljs-string">"WECHAT_ENTERPRISE"</span>); config.setState(UuidUtils.getUUID()); config.setJustAuthConfig(AuthConfig.builder() .clientId(<span class="hljs-string">"**上文中的ClientID**"</span>) .clientSecret(<span class="hljs-string">"上文中的ClientSecret"</span>) .agentId(<span class="hljs-string">"上文中的AgentID"</span>) <span class="hljs-comment">//redirectUri的域名和端口要与回调域一致</span> .redirectUri(<span class="hljs-string">"http://local.lzy2002.com:8080/auth/login"</span>) .build()); JapResponse japResponse = socialStrategy.authenticate(config, <span class="hljs-keyword">new</span> JakartaRequestAdapter(request), <span class="hljs-keyword">new</span> JakartaResponseAdapter(response)); <span class="hljs-keyword">if</span> (!japResponse.isSuccess()) { <span class="hljs-keyword">return</span> <span class="hljs-string">"登录失败"</span>; } <span class="hljs-keyword">if</span> (japResponse.isRedirectUrl()) { <span class="hljs-keyword">try</span> { response.sendRedirect((String) japResponse.getData()); } <span class="hljs-keyword">catch</span> (IOException e) { e.printStackTrace(); } } <span class="hljs-keyword">else</span> { <span class="hljs-keyword">try</span> { System.out.println(mapper.writeValueAsString(japResponse.getData())); } <span class="hljs-keyword">catch</span> (JsonProcessingException e) { e.printStackTrace(); } <span class="hljs-keyword">return</span> <span class="hljs-string">"登录成功"</span>; } <span class="hljs-keyword">return</span> <span class="hljs-string">""</span>; }
}
运行效果
访问 http://127.0.0.1:8080/auth/login
控制台打印了用户数据