评论

SpringBoot对接企业微信扫码登录

利用JustAuth在SpringBoot对接企业微信扫码登录

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 {
    
        /**
         * 根据第三方平台标识(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;
        }
    
    }
    
  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 {
    
        @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



控制台打印了用户数据

参考资料

最后一次编辑于  2022-02-10  
点赞 1
收藏
评论
登录 后发表内容