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 { /** * 根据第三方平台标识(platform)和第三方平台的用户 uid 查询数据库 * * @param platform 第三方平台标识 * @param uid 第三方平台的用户 uid * @return JapUser */ @Override public JapUser getByPlatformAndUid(String platform, String uid) { return null; } /** * 创建并获取第三方用户,相当于第三方登录成功后,将授权 关 系保存到数据库(开发者业务系统中 social user -> sys user 的绑定关系) * * @param userInfo JustAuth 中的 AuthUser * @return JapUser */ @Override public JapUser createAndGetSocialUser(Object userInfo) { AuthUser authUser = (AuthUser) userInfo; // 查询绑定关系,确定当前用户是否已经登录过业务系统 JapUser japUser = this.getByPlatformAndUid(authUser.getSource(), authUser.getUuid()); if (null == japUser) { // 添加用户 japUser = new JapUser(); japUser.setUserId(authUser.getUuid()); japUser.setUsername(authUser.getUsername()) ; japUser.setAdditional(authUser); } return 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 { @Autowired ObjectMapper mapper; @Autowired JapUserService japUserService; @GetMapping("/login") public Object login(HttpServletRequest request, HttpServletResponse response) { SocialStrategy socialStrategy = new SocialStrategy(japUserService, new JapConfig()); SocialConfig config = new SocialConfig(); config.setPlatform("WECHAT_ENTERPRISE"); config.setState(UuidUtils.getUUID()); config.setJustAuthConfig(AuthConfig.builder() .clientId("**上文中的ClientID**") .clientSecret("上文中的ClientSecret") .agentId("上文中的AgentID") //redirectUri的域名和端口要与回调域一致 .redirectUri("http://local.lzy2002.com:8080/auth/login") .build()); JapResponse japResponse = socialStrategy.authenticate(config, new JakartaRequestAdapter(request), new JakartaResponseAdapter(response)); if (!japResponse.isSuccess()) { return "登录失败"; } if (japResponse.isRedirectUrl()) { try { response.sendRedirect((String) japResponse.getData()); } catch (IOException e) { e.printStackTrace(); } } else { try { System.out.println(mapper.writeValueAsString(japResponse.getData())); } catch (JsonProcessingException e) { e.printStackTrace(); } return "登录成功"; } return ""; } }
运行效果
访问 http://127.0.0.1:8080/auth/login
控制台打印了用户数据