SpringBoot对接企业微信扫码登录
发布于 2 年前 作者 eshen 3480 次浏览 来自 分享

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等。

开发

  1. 在企业微信后台中添加应用





    配置回调域
  2. 记录下应用的相关信息,在后文要用到

  3. 创建一个 SpringBoot 项目
  4. 添加 jap-social 依赖
    implementation 'com.fujieid:jap-social:1.0.7'
    
  5. 创建接口 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 -&gt;  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;
    }
    

    }

  6. 创建控制器
    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



控制台打印了用户数据

参考资料

回到顶部