Details
diff --git a/forms/common-themes/src/main/resources/theme/base/login/login.ftl b/forms/common-themes/src/main/resources/theme/base/login/login.ftl
index 388d180..840bf4e 100755
--- a/forms/common-themes/src/main/resources/theme/base/login/login.ftl
+++ b/forms/common-themes/src/main/resources/theme/base/login/login.ftl
@@ -70,9 +70,7 @@
<div id="kc-social-providers">
<ul>
<#list social.providers as p>
- <#assign zocialclass=p.alias>
- <#if zocialclass=="microsoft"><#assign zocialclass="windows"></#if>
- <li><a href="${p.loginUrl}" id="zocial-${p.alias}" class="zocial ${zocialclass}"> <span class="text">${p.alias}</span></a></li>
+ <li><a href="${p.loginUrl}" id="zocial-${p.alias}" class="zocial ${p.providerId}"> <span class="text">${p.alias}</span></a></li>
</#list>
</ul>
</div>
diff --git a/forms/common-themes/src/main/resources/theme/keycloak/login/resources/css/login.css b/forms/common-themes/src/main/resources/theme/keycloak/login/resources/css/login.css
index 0c05a4b..1258b22 100644
--- a/forms/common-themes/src/main/resources/theme/keycloak/login/resources/css/login.css
+++ b/forms/common-themes/src/main/resources/theme/keycloak/login/resources/css/login.css
@@ -246,6 +246,9 @@ ol#kc-totp-settings li:first-of-type {
.zocial.facebook,
.zocial.github,
.zocial.google,
+.zocial.microsoft,
+.zocial.stackoverflow,
+.zocial.linkedin,
.zocial.twitter {
background-image: none;
border-radius: 2px;
@@ -267,10 +270,18 @@ ol#kc-totp-settings li:first-of-type {
.zocial.facebook:hover,
.zocial.github:hover,
.zocial.google:hover,
+.zocial.microsoft:hover,
+.zocial.stackoverflow:hover,
+.zocial.linkedin:hover,
.zocial.twitter:hover {
background-image: linear-gradient(rgba(0, 0, 0, 0.2) 0%, rgba(0, 0, 0, 0.2) 100%) !important;
}
+/* Copy of zocial windows classes to be used for microsoft's social provider button */
+.zocial.microsoft {background-color: #0052a4; color: #fff;}
+.zocial.microsoft:before { content: "\f15d"; }
+
+
@media (min-width: 768px) {
#kc-container-wrapper {
bottom: 13%;
diff --git a/social/microsoft/src/main/java/org/keycloak/social/microsoft/MicrosoftIdentityProvider.java b/social/microsoft/src/main/java/org/keycloak/social/microsoft/MicrosoftIdentityProvider.java
index 6d84c7e..b2f3856 100755
--- a/social/microsoft/src/main/java/org/keycloak/social/microsoft/MicrosoftIdentityProvider.java
+++ b/social/microsoft/src/main/java/org/keycloak/social/microsoft/MicrosoftIdentityProvider.java
@@ -15,62 +15,64 @@ import org.keycloak.broker.provider.IdentityBrokerException;
import org.keycloak.broker.provider.util.SimpleHttp;
import org.keycloak.social.SocialIdentityProvider;
-
/**
+ *
+ * Identity provider for Microsoft account. Uses OAuth 2 protocol of Windows Live Services as documented at <a href="https://msdn.microsoft.com/en-us/library/hh243647.aspx">https://msdn.microsoft.com/en-us/library/hh243647.aspx</a>
+ *
* @author Vlastimil Elias (velias at redhat dot com)
*/
public class MicrosoftIdentityProvider extends AbstractOAuth2IdentityProvider implements SocialIdentityProvider {
-
+
private static final Logger log = Logger.getLogger(MicrosoftIdentityProvider.class);
- public static final String AUTH_URL = "https://login.live.com/oauth20_authorize.srf";
- public static final String TOKEN_URL = "https://login.live.com/oauth20_token.srf";
- public static final String PROFILE_URL = "https://apis.live.net/v5.0/me";
- public static final String DEFAULT_SCOPE = "wl.basic,wl.emails";
+ public static final String AUTH_URL = "https://login.live.com/oauth20_authorize.srf";
+ public static final String TOKEN_URL = "https://login.live.com/oauth20_token.srf";
+ public static final String PROFILE_URL = "https://apis.live.net/v5.0/me";
+ public static final String DEFAULT_SCOPE = "wl.basic,wl.emails";
- public MicrosoftIdentityProvider(OAuth2IdentityProviderConfig config) {
- super(config);
- config.setAuthorizationUrl(AUTH_URL);
- config.setTokenUrl(TOKEN_URL);
- config.setUserInfoUrl(PROFILE_URL);
- }
+ public MicrosoftIdentityProvider(OAuth2IdentityProviderConfig config) {
+ super(config);
+ config.setAuthorizationUrl(AUTH_URL);
+ config.setTokenUrl(TOKEN_URL);
+ config.setUserInfoUrl(PROFILE_URL);
+ }
- @Override
- protected BrokeredIdentityContext doGetFederatedIdentity(String accessToken) {
- try {
- String URL = PROFILE_URL + "?access_token=" + URLEncoder.encode(accessToken,"UTF-8");
+ @Override
+ protected BrokeredIdentityContext doGetFederatedIdentity(String accessToken) {
+ try {
+ String URL = PROFILE_URL + "?access_token=" + URLEncoder.encode(accessToken, "UTF-8");
if (log.isDebugEnabled()) {
log.debug("Microsoft Live user profile request to: " + URL);
}
- JsonNode profile = JsonSimpleHttp.asJson(SimpleHttp.doGet(URL));
+ JsonNode profile = JsonSimpleHttp.asJson(SimpleHttp.doGet(URL));
+
+ String id = getJsonProperty(profile, "id");
+
+ String email = null;
+ if (profile.has("emails")) {
+ email = getJsonProperty(profile.get("emails"), "preferred");
+ }
- String id = getJsonProperty(profile, "id");
-
- String email = null;
- if(profile.has("emails")){
- email = getJsonProperty(profile.get("emails"), "preferred");
- }
-
- BrokeredIdentityContext user = new BrokeredIdentityContext(id);
+ BrokeredIdentityContext user = new BrokeredIdentityContext(id);
- user.setUsername(email!=null?email:id);
- user.setFirstName(getJsonProperty(profile, "first_name"));
- user.setLastName(getJsonProperty(profile, "last_name"));
- if(email!=null)
- user.setEmail(email);
- user.setIdpConfig(getConfig());
- user.setIdp(this);
+ user.setUsername(email != null ? email : id);
+ user.setFirstName(getJsonProperty(profile, "first_name"));
+ user.setLastName(getJsonProperty(profile, "last_name"));
+ if (email != null)
+ user.setEmail(email);
+ user.setIdpConfig(getConfig());
+ user.setIdp(this);
- AbstractJsonUserAttributeMapper.storeUserProfileForMapper(user, profile, getConfig().getAlias());
+ AbstractJsonUserAttributeMapper.storeUserProfileForMapper(user, profile, getConfig().getAlias());
- return user;
- } catch (Exception e) {
- throw new IdentityBrokerException("Could not obtain user profile from Microsoft Live ID.", e);
- }
- }
+ return user;
+ } catch (Exception e) {
+ throw new IdentityBrokerException("Could not obtain user profile from Microsoft Live ID.", e);
+ }
+ }
- @Override
- protected String getDefaultScopes() {
- return DEFAULT_SCOPE;
- }
+ @Override
+ protected String getDefaultScopes() {
+ return DEFAULT_SCOPE;
+ }
}