SpringBoot对接企业微信扫码登录

发布于 4 年前作者 eshen3740 次浏览最后编辑 4 年前来自 share

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. 在企业微信后台中添加应用
    WXOPEN Club 内容图片
    WXOPEN Club 内容图片
    WXOPEN Club 内容图片
    WXOPEN Club 内容图片
    WXOPEN Club 内容图片
    配置回调域
    WXOPEN Club 内容图片
  2. 记录下应用的相关信息,在后文要用到
    WXOPEN Club 内容图片
    WXOPEN Club 内容图片
  3. 创建一个 SpringBoot 项目
    WXOPEN Club 内容图片
  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



控制台打印了用户数据

参考资料

0 回复
暂无回复