From e6802132cf4d202bcbcb2aa531fd29dbd010dd20 Mon Sep 17 00:00:00 2001 From: MaxKey Date: Sat, 24 Jul 2021 09:12:07 +0800 Subject: [PATCH] workweixin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 企业扫描微信登录 --- .../AbstractSocialSignOnEndpoint.java | 6 +- .../socialsignon/SocialSignOnEndpoint.java | 37 +++++--- .../service/JdbcSocialsAssociateService.java | 20 +++-- .../service/SocialSignOnProvider.java | 85 ++++++++++++------- .../service/SocialSignOnProviderService.java | 7 +- .../SocialSignOnAutoConfiguration.java | 4 + .../resources/application-http.properties | 9 ++ .../resources/application-https.properties | 9 ++ 8 files changed, 127 insertions(+), 50 deletions(-) diff --git a/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/AbstractSocialSignOnEndpoint.java b/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/AbstractSocialSignOnEndpoint.java index 57eff236..55dcbb1f 100644 --- a/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/AbstractSocialSignOnEndpoint.java +++ b/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/AbstractSocialSignOnEndpoint.java @@ -24,6 +24,7 @@ import org.maxkey.authn.AbstractAuthenticationProvider; import org.maxkey.authn.support.socialsignon.service.SocialSignOnProvider; import org.maxkey.authn.support.socialsignon.service.SocialSignOnProviderService; import org.maxkey.authn.support.socialsignon.service.SocialsAssociateService; +import org.maxkey.configuration.ApplicationConfig; import org.maxkey.web.WebContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -77,6 +78,9 @@ public class AbstractSocialSignOnEndpoint { @Autowired @Qualifier("authenticationProvider") AbstractAuthenticationProvider authenticationProvider ; + + @Autowired + ApplicationConfig applicationConfig; protected AuthRequest buildAuthRequest(String provider){ @@ -84,7 +88,7 @@ public class AbstractSocialSignOnEndpoint { _logger.debug("socialSignOn Provider : "+socialSignOnProvider); if(socialSignOnProvider!=null){ - authRequest=socialSignOnProviderService.getAuthRequest(provider); + authRequest=socialSignOnProviderService.getAuthRequest(provider,applicationConfig); WebContext.setAttribute(SOCIALSIGNON_OAUTH_SERVICE_SESSION, authRequest); WebContext.setAttribute(SOCIALSIGNON_PROVIDER_SESSION, socialSignOnProvider); return authRequest; diff --git a/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/SocialSignOnEndpoint.java b/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/SocialSignOnEndpoint.java index 97baac4b..f53b32ea 100644 --- a/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/SocialSignOnEndpoint.java +++ b/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/SocialSignOnEndpoint.java @@ -22,7 +22,9 @@ package org.maxkey.authn.support.socialsignon; import javax.servlet.http.HttpServletRequest; +import org.maxkey.authn.support.socialsignon.service.SocialSignOnProvider; import org.maxkey.authn.support.socialsignon.service.SocialsAssociate; +import org.maxkey.configuration.ApplicationConfig; import org.maxkey.constants.ConstantsLoginType; import org.maxkey.web.WebContext; import org.slf4j.Logger; @@ -33,10 +35,9 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; -import me.zhyd.oauth.utils.AuthStateUtils; - /** * @author Crystal.Sea * @@ -46,25 +47,26 @@ import me.zhyd.oauth.utils.AuthStateUtils; public class SocialSignOnEndpoint extends AbstractSocialSignOnEndpoint{ final static Logger _logger = LoggerFactory.getLogger(SocialSignOnEndpoint.class); - public ModelAndView socialSignOnAuthorize(String provider){ + public ModelAndView socialSignOnAuthorize(HttpServletRequest request,String provider){ _logger.debug("SocialSignOn provider : "+provider); - String authorizationUrl=buildAuthRequest(provider).authorize(AuthStateUtils.createState()); + String authorizationUrl=buildAuthRequest(provider).authorize(request.getSession().getId()); _logger.debug("authorize SocialSignOn : "+authorizationUrl); return WebContext.redirect(authorizationUrl); } @RequestMapping(value={"/authorize/{provider}"}, method = RequestMethod.GET) - public ModelAndView authorize(@PathVariable String provider) { + public ModelAndView authorize(HttpServletRequest request, + @PathVariable String provider) { WebContext.setAttribute(SOCIALSIGNON_TYPE_SESSION, SOCIALSIGNON_TYPE.SOCIALSIGNON_TYPE_LOGON); - return socialSignOnAuthorize(provider); + return socialSignOnAuthorize(request,provider); } @RequestMapping(value={"/bind/{provider}"}, method = RequestMethod.GET) public ModelAndView bind(HttpServletRequest request, - @PathVariable String provider) { + @PathVariable String provider) { WebContext.setAttribute(SOCIALSIGNON_SESSION_REDIRECT_URI, request.getParameter(SOCIALSIGNON_REDIRECT_URI)); WebContext.setAttribute(SOCIALSIGNON_TYPE_SESSION, SOCIALSIGNON_TYPE.SOCIALSIGNON_TYPE_BIND); - return socialSignOnAuthorize(provider); + return socialSignOnAuthorize(request,provider); } @RequestMapping(value={"/unbind/{provider}"}, method = RequestMethod.GET) @@ -88,10 +90,23 @@ public class SocialSignOnEndpoint extends AbstractSocialSignOnEndpoint{ } @RequestMapping(value={"/authorize/{provider}/{appid}"}, method = RequestMethod.GET) - public ModelAndView authorize2AppId(@PathVariable("provider") String provider, - @PathVariable("appid") String appid) { + public ModelAndView authorize2AppId(HttpServletRequest request, + @PathVariable("provider") String provider, + @PathVariable("appid") String appid) { WebContext.setAttribute(SOCIALSIGNON_SESSION_REDIRECT_URI, "/authorize/"+appid); - return authorize(provider); + return authorize(request,provider); + } + + @RequestMapping(value={"/scanqrcode/{provider}"}, method = RequestMethod.GET) + @ResponseBody + public SocialSignOnProvider scanQRCode( + HttpServletRequest request, + @PathVariable("provider") String provider) { + socialSignOnAuthorize(request,provider); + SocialSignOnProvider socialSignOnProvider = socialSignOnProviderService.get(provider); + socialSignOnProvider.setState(request.getSession().getId()); + socialSignOnProvider.setRedirectUri(applicationConfig.getServerPrefix()+ "/logon/oauth20/callback/"+provider); + return socialSignOnProvider; } diff --git a/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/service/JdbcSocialsAssociateService.java b/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/service/JdbcSocialsAssociateService.java index 30ffc956..05af0c3a 100644 --- a/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/service/JdbcSocialsAssociateService.java +++ b/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/service/JdbcSocialsAssociateService.java @@ -1,6 +1,6 @@ /* * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -33,24 +33,34 @@ public class JdbcSocialsAssociateService implements SocialsAssociateService{ private static final String DEFAULT_DEFAULT_INSERT_STATEMENT = "INSERT INTO MXK_SOCIALS_ASSOCIATE(ID, UID , USERNAME , PROVIDER , SOCIALUID , ACCESSTOKEN , SOCIALUSERINFO , EXATTRIBUTE )VALUES( ? , ? , ? , ? , ?, ? , ? , ?)"; - private static final String DEFAULT_DEFAULT_SIGNON_SELECT_STATEMENT = "SELECT ID, UID , USERNAME , PROVIDER , SOCIALUID , ACCESSTOKEN , SOCIALUSERINFO , EXATTRIBUTE , CREATEDDATE , UPDATEDDATE FROM MXK_SOCIALS_ASSOCIATE WHERE PROVIDER = ? AND SOCIALUID = ?"; + private static final String DEFAULT_DEFAULT_INSERT_STATEMENT_ORACLE = "INSERT INTO MXK_SOCIALS_ASSOCIATE(ID, \"UID\" , USERNAME , PROVIDER , SOCIALUID , ACCESSTOKEN , SOCIALUSERINFO , EXATTRIBUTE )VALUES( ? , ? , ? , ? , ?, ? , ? , ?)"; + + private static final String DEFAULT_DEFAULT_SIGNON_SELECT_STATEMENT = "SELECT ID, \"UID\" , USERNAME , PROVIDER , SOCIALUID , ACCESSTOKEN , SOCIALUSERINFO , EXATTRIBUTE , CREATEDDATE , UPDATEDDATE FROM MXK_SOCIALS_ASSOCIATE WHERE PROVIDER = ? AND SOCIALUID = ?"; - private static final String DEFAULT_DEFAULT_BIND_SELECT_STATEMENT = "SELECT ID, UID , USERNAME , PROVIDER , SOCIALUID , ACCESSTOKEN , SOCIALUSERINFO , EXATTRIBUTE , CREATEDDATE , UPDATEDDATE FROM MXK_SOCIALS_ASSOCIATE WHERE UID = ?" ; + private static final String DEFAULT_DEFAULT_BIND_SELECT_STATEMENT = "SELECT ID, \"UID\" , USERNAME , PROVIDER , SOCIALUID , ACCESSTOKEN , SOCIALUSERINFO , EXATTRIBUTE , CREATEDDATE , UPDATEDDATE FROM MXK_SOCIALS_ASSOCIATE WHERE \"UID\" = ?" ; - private static final String DEFAULT_DEFAULT_DELETE_STATEMENT = "DELETE FROM MXK_SOCIALS_ASSOCIATE WHERE UID = ? AND PROVIDER = ?"; + private static final String DEFAULT_DEFAULT_DELETE_STATEMENT = "DELETE FROM MXK_SOCIALS_ASSOCIATE WHERE \"UID\" = ? AND PROVIDER = ?"; private static final String DEFAULT_DEFAULT_UPDATE_STATEMENT= "UPDATE MXK_SOCIALS_ASSOCIATE SET ACCESSTOKEN = ? , SOCIALUSERINFO = ? , EXATTRIBUTE = ? ,UPDATEDDATE = ? WHERE ID = ?"; private final JdbcTemplate jdbcTemplate; + private String jdbcType; + public JdbcSocialsAssociateService(JdbcTemplate jdbcTemplate) { this.jdbcTemplate=jdbcTemplate; + try { + jdbcType = jdbcTemplate.getDataSource().getConnection().getMetaData().getDatabaseProductName(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } @Override public boolean insert(SocialsAssociate socialsAssociate) { socialsAssociate.setId(socialsAssociate.generateId()); - jdbcTemplate.update(DEFAULT_DEFAULT_INSERT_STATEMENT, + jdbcTemplate.update("Oracle".equals(jdbcType)?DEFAULT_DEFAULT_INSERT_STATEMENT_ORACLE:DEFAULT_DEFAULT_INSERT_STATEMENT, new Object[] { socialsAssociate.getId(), socialsAssociate.getUid(), diff --git a/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/service/SocialSignOnProvider.java b/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/service/SocialSignOnProvider.java index 01352776..19e228c8 100644 --- a/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/service/SocialSignOnProvider.java +++ b/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/service/SocialSignOnProvider.java @@ -28,14 +28,15 @@ public class SocialSignOnProvider { private String icon; private String clientId; private String clientSecret; + private String redirectUri; + private String agentId; private String accountId; private String bindTime; private String unBindTime; private String lastLoginTime; + private String state; private int sortOrder; - - private boolean userBind; /** @@ -134,34 +135,58 @@ public class SocialSignOnProvider { this.lastLoginTime = lastLoginTime; } - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("SocialSignOnProvider [provider="); - builder.append(provider); - builder.append(", providerName="); - builder.append(providerName); - builder.append(", icon="); - builder.append(icon); - builder.append(", clientId="); - builder.append(clientId); - builder.append(", clientSecret="); - builder.append(clientSecret); - builder.append(", accountId="); - builder.append(accountId); - builder.append(", bindTime="); - builder.append(bindTime); - builder.append(", unBindTime="); - builder.append(unBindTime); - builder.append(", lastLoginTime="); - builder.append(lastLoginTime); - builder.append(", sortOrder="); - builder.append(sortOrder); - builder.append(", userBind="); - builder.append(userBind); - builder.append("]"); - return builder.toString(); - } + public String getRedirectUri() { + return redirectUri; + } + + public void setRedirectUri(String redirectUri) { + this.redirectUri = redirectUri; + } + + public String getAgentId() { + return agentId; + } + + public void setAgentId(String agentId) { + this.agentId = agentId; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("SocialSignOnProvider [provider="); + builder.append(provider); + builder.append(", providerName="); + builder.append(providerName); + builder.append(", clientId="); + builder.append(clientId); + builder.append(", clientSecret="); + builder.append(clientSecret); + builder.append(", agentId="); + builder.append(agentId); + builder.append(", accountId="); + builder.append(accountId); + builder.append(", bindTime="); + builder.append(bindTime); + builder.append(", unBindTime="); + builder.append(unBindTime); + builder.append(", lastLoginTime="); + builder.append(lastLoginTime); + builder.append(", sortOrder="); + builder.append(sortOrder); + builder.append(", userBind="); + builder.append(userBind); + builder.append("]"); + return builder.toString(); + } diff --git a/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/service/SocialSignOnProviderService.java b/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/service/SocialSignOnProviderService.java index 014217d2..bab9123b 100644 --- a/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/service/SocialSignOnProviderService.java +++ b/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/authn/support/socialsignon/service/SocialSignOnProviderService.java @@ -20,6 +20,7 @@ package org.maxkey.authn.support.socialsignon.service; import java.util.HashMap; import java.util.List; +import org.maxkey.configuration.ApplicationConfig; import org.maxkey.web.WebContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,12 +44,12 @@ public class SocialSignOnProviderService{ return socialSignOnProviderMaps.get(provider); } - public AuthRequest getAuthRequest(String provider) { + public AuthRequest getAuthRequest(String provider,ApplicationConfig applicationConfig) { AuthRequest authRequest = null; AuthConfig authConfig = AuthConfig.builder() .clientId(this.get(provider).getClientId()) .clientSecret(this.get(provider).getClientSecret()) - .redirectUri(WebContext.getHttpContextPath()+ "/logon/oauth20/callback/"+provider) + .redirectUri(applicationConfig.getServerPrefix()+ "/logon/oauth20/callback/"+provider) .build(); if(provider.equalsIgnoreCase("WeChatOpen")) { @@ -99,7 +100,7 @@ public class SocialSignOnProviderService{ authRequest = new AuthToutiaoRequest(authConfig); }else if(provider.equalsIgnoreCase("WeChatQyQrcode")) { authRequest = new AuthWeChatEnterpriseQrcodeRequest(authConfig); - }else if(provider.equalsIgnoreCase("WeChatQyWeb")) { + }else if(provider.equalsIgnoreCase("workweixin")) { authRequest = new AuthWeChatEnterpriseWebRequest(authConfig); } diff --git a/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/autoconfigure/SocialSignOnAutoConfiguration.java b/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/autoconfigure/SocialSignOnAutoConfiguration.java index 3ec0c72d..8f43802b 100644 --- a/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/autoconfigure/SocialSignOnAutoConfiguration.java +++ b/maxkey-authentications/maxkey-authentication-social/src/main/java/org/maxkey/autoconfigure/SocialSignOnAutoConfiguration.java @@ -57,6 +57,8 @@ public class SocialSignOnAutoConfiguration implements InitializingBean { String clientId=applicationProperty.getProperty("maxkey.socialsignon."+provider+".client.id"); String clientSecret=applicationProperty.getProperty("maxkey.socialsignon."+provider+".client.secret"); String sortOrder = applicationProperty.getProperty("maxkey.socialsignon."+provider+".sortorder"); + String agentId = applicationProperty.getProperty("maxkey.socialsignon."+provider+".agent.id"); + SocialSignOnProvider socialSignOnProvider = new SocialSignOnProvider(); socialSignOnProvider.setProvider(provider); socialSignOnProvider.setProviderName(providerName); @@ -64,6 +66,8 @@ public class SocialSignOnAutoConfiguration implements InitializingBean { socialSignOnProvider.setClientId(clientId); socialSignOnProvider.setClientSecret(clientSecret); socialSignOnProvider.setSortOrder(Integer.valueOf(sortOrder)); + socialSignOnProvider.setAgentId(agentId); + _logger.debug("socialSignOnProvider " + socialSignOnProvider.getProvider() + "(" + socialSignOnProvider.getProviderName()+")"); _logger.trace("socialSignOnProvider " + socialSignOnProvider); diff --git a/maxkey-web-maxkey/src/main/resources/application-http.properties b/maxkey-web-maxkey/src/main/resources/application-http.properties index 474799ab..a6c1bac9 100644 --- a/maxkey-web-maxkey/src/main/resources/application-http.properties +++ b/maxkey-web-maxkey/src/main/resources/application-http.properties @@ -371,6 +371,15 @@ maxkey.socialsignon.wechatopen.client.id=ee6fdc484b3398d17e7 maxkey.socialsignon.wechatopen.client.secret=7a5faccdbad maxkey.socialsignon.wechatopen.account.id=id maxkey.socialsignon.wechatopen.sortorder=2 +#work weixin +maxkey.socialsignon.workweixin.provider=workweixin +maxkey.socialsignon.workweixin.provider.name=\u4F01\u4E1A\u5fae\u4fe1 +maxkey.socialsignon.workweixin.icon=images/social/wechat.png +maxkey.socialsignon.workweixin.client.id=wx00d052e8f417f8f9 +maxkey.socialsignon.workweixin.client.secret=lIy40iP0z4D65eJaWDNoe-vSlttmqY2WGJBygbM0TlY +maxkey.socialsignon.workweixin.agent.id=1000002 +maxkey.socialsignon.workweixin.account.id=id +maxkey.socialsignon.workweixin.sortorder=2 #sina weibo maxkey.socialsignon.sinaweibo.provider=sinaweibo maxkey.socialsignon.sinaweibo.provider.name=\u65b0\u6d6a\u5fae\u535a diff --git a/maxkey-web-maxkey/src/main/resources/application-https.properties b/maxkey-web-maxkey/src/main/resources/application-https.properties index 6c792d38..deb0b6cc 100644 --- a/maxkey-web-maxkey/src/main/resources/application-https.properties +++ b/maxkey-web-maxkey/src/main/resources/application-https.properties @@ -363,6 +363,15 @@ maxkey.socialsignon.wechatopen.client.id=ee6fdc484b3398d17e7 maxkey.socialsignon.wechatopen.client.secret=7a5faccdbad maxkey.socialsignon.wechatopen.account.id=id maxkey.socialsignon.wechatopen.sortorder=2 +#work weixin +maxkey.socialsignon.workweixin.provider=workweixin +maxkey.socialsignon.workweixin.provider.name=\u4F01\u4E1A\u5fae\u4fe1 +maxkey.socialsignon.workweixin.icon=images/social/wechat.png +maxkey.socialsignon.workweixin.client.id=wx00d052e8f417f8f9 +maxkey.socialsignon.workweixin.client.secret=lIy40iP0z4D65eJaWDNoe-vSlttmqY2WGJBygbM0TlY +maxkey.socialsignon.workweixin.agent.id=1000002 +maxkey.socialsignon.workweixin.account.id=id +maxkey.socialsignon.workweixin.sortorder=2 #sina weibo maxkey.socialsignon.sinaweibo.provider=sinaweibo maxkey.socialsignon.sinaweibo.provider.name=\u65b0\u6d6a\u5fae\u535a -- GitLab