Skip to content

Commit

Permalink
fix(UNI-160): simplify user agent detection
Browse files Browse the repository at this point in the history
  • Loading branch information
Jeff-Tian committed Aug 27, 2023
1 parent 710d3d9 commit 923a49d
Show file tree
Hide file tree
Showing 9 changed files with 38 additions and 24 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-services-social-weixin</artifactId>
<version>0.4.4</version>
<version>0.4.5</version>
<name>Keycloak Services Social WeiXin</name>
<description/>
<properties>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import org.keycloak.models.UserModel;
import org.keycloak.social.weixin.helpers.JsonHelper;

import java.lang.reflect.Type;
import java.util.Objects;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@
import org.keycloak.services.util.BrowserHistoryHelper;
import org.keycloak.services.validation.Validation;
import org.keycloak.sessions.AuthenticationSessionModel;
import org.keycloak.social.weixin.helpers.JsonHelper;
import org.keycloak.social.weixin.helpers.WMPHelper;
import org.keycloak.util.JsonSerialization;

import java.io.IOException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.keycloak.social.weixin.helpers.UserAgentHelper;
import org.keycloak.social.weixin.helpers.WMPHelper;

public class WeiXinIdentityProvider extends AbstractOAuth2IdentityProvider<OAuth2IdentityProviderConfig>
implements SocialIdentityProvider<OAuth2IdentityProviderConfig> {
Expand Down Expand Up @@ -166,7 +168,7 @@ public Response performLogin(AuthenticationRequest request) {
String ua = request.getSession().getContext().getRequestHeaders().getHeaderString("user-agent").toLowerCase();
logger.info(String.format("user-agent = %s", ua));

if (isWechatBrowser(ua)) {
if (UserAgentHelper.isWechatBrowser(ua)) {
URI location = URI.create(String.format("%s#wechat_redirect", authorizationUrl));
logger.info(String.format("see other %s", location));

Expand All @@ -187,33 +189,23 @@ protected String getDefaultScopes() {
return OPEN_DEFAULT_SCOPE;
}

/**
* 判断是否在微信浏览器里面请求
*
* @param ua 浏览器user-agent
* @return
*/
private boolean isWechatBrowser(String ua) {
String wechatAppId = getConfig().getConfig().get(WECHAT_MP_APP_ID);
String wechatAppSecret = getConfig().getConfig().get(WECHAT_MP_APP_SECRET);
return ua.indexOf(WECHATFLAG) > 0 && wechatAppId != null && wechatAppSecret != null
&& !wechatAppId.isEmpty() && !wechatAppSecret.isEmpty();
}


@Override
protected UriBuilder createAuthorizationUrl(AuthenticationRequest request) {
final UriBuilder uriBuilder;
String ua = request.getSession().getContext().getRequestHeaders().getHeaderString("user-agent").toLowerCase();
logger.info(String.format("creating auth url from %s", ua));

if (isWechatBrowser(ua)) {// 是微信浏览器
if (UserAgentHelper.isWechatBrowser(ua)) {// 是微信浏览器
logger.info("----------wechat");
uriBuilder = UriBuilder.fromUri(WECHAT_MOBILE_AUTH_URL);
uriBuilder.queryParam(OAUTH2_PARAMETER_SCOPE, WECHAT_MP_DEFAULT_SCOPE)
.queryParam(OAUTH2_PARAMETER_STATE, request.getState().getEncoded())
.queryParam(OAUTH2_PARAMETER_RESPONSE_TYPE, "code")
.queryParam(OAUTH2_PARAMETER_CLIENT_ID, getConfig().getClientId())
.queryParam(OAUTH2_PARAMETER_REDIRECT_URI, request.getRedirectUri());

return uriBuilder;
} else {
var config = getConfig();
if (config instanceof WeixinIdentityProviderConfig) {
Expand Down Expand Up @@ -310,7 +302,7 @@ public Response authResponse(@QueryParam(AbstractOAuth2IdentityProvider.OAUTH2_P
var wechatLoginType = WechatLoginType.FROM_PC_QR_CODE_SCANNING;

String ua = session.getContext().getRequestHeaders().getHeaderString("user-agent").toLowerCase();
if (isWechatBrowser(ua)) {
if (UserAgentHelper.isWechatBrowser(ua)) {
logger.info("user-agent=wechat");
wechatLoginType = WechatLoginType.FROM_WECHAT_BROWSER;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package org.keycloak.social.weixin;
package org.keycloak.social.weixin.helpers;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.keycloak.models.UserModel;
import org.keycloak.social.weixin.UserModelSerializer;
import org.keycloak.social.weixin.WMPUserSessionModel;
import org.keycloak.social.weixin.WMPUserSessionModelSerializer;

import java.lang.reflect.Type;

Expand All @@ -21,4 +24,4 @@ public static String stringify(Object anything, Type type) {
public static Object parse(String s) {
return gson.fromJson(s, Object.class);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.keycloak.social.weixin.helpers;

import static org.keycloak.social.weixin.WeiXinIdentityProvider.WECHATFLAG;

public class UserAgentHelper {
public static boolean isWechatBrowser(String ua) {
return ua.indexOf(WECHATFLAG) > 0;
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package org.keycloak.social.weixin;
package org.keycloak.social.weixin.helpers;

import org.keycloak.broker.provider.BrokeredIdentityContext;
import org.keycloak.broker.provider.util.IdentityBrokerState;
import org.keycloak.models.*;
import org.keycloak.services.managers.ClientSessionCode;
import org.keycloak.sessions.AuthenticationSessionModel;
import org.keycloak.social.weixin.AuthenticatedWMPSession;
import org.keycloak.social.weixin.WMPUserSessionModel;
import org.keycloak.social.weixin.WeiXinIdentityBrokerService;

import java.util.*;
import java.util.stream.Stream;
Expand All @@ -18,7 +21,7 @@ public static UserSessionModel getUserSessionModel(BrokeredIdentityContext conte
return new WMPUserSessionModel(context, federatedUser, authSession);
}

static ClientSessionCode getClientSessionCode(WeiXinIdentityBrokerService weiXinIdentityBrokerService, RealmModel realmModel, KeycloakSession session, BrokeredIdentityContext context) {
public static ClientSessionCode getClientSessionCode(WeiXinIdentityBrokerService weiXinIdentityBrokerService, RealmModel realmModel, KeycloakSession session, BrokeredIdentityContext context) {
final UserModel userModel = new UserModel() {
@Override
public String getId() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package org.keycloak.social.weixin;
package org.keycloak.social.weixin.helpers;

import org.junit.Assert;
import org.junit.jupiter.api.Test;
import org.keycloak.broker.provider.BrokeredIdentityContext;
import org.keycloak.models.*;
import org.keycloak.sessions.AuthenticationSessionModel;
import org.keycloak.sessions.RootAuthenticationSessionModel;
import org.keycloak.social.weixin.WMPUserSessionModel;
import org.keycloak.social.weixin.helpers.JsonHelper;
import org.keycloak.social.weixin.helpers.WMPHelper;

import java.util.List;
import java.util.Map;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.keycloak.social.weixin;
package org.keycloak.social.weixin.helpers;

import org.junit.jupiter.api.Test;
import org.keycloak.social.weixin.helpers.WMPHelper;

import static org.junit.jupiter.api.Assertions.*;

Expand All @@ -10,4 +11,4 @@ class WMPHelperTest {
void createStateForWMP() {
assertEquals("wmp.tab.client", WMPHelper.createStateForWMP("client", "tab"));
}
}
}

0 comments on commit 923a49d

Please sign in to comment.