keycloak
公開メンバ関数 | 公開変数類 | 静的公開変数類 | 限定公開メンバ関数 | 限定公開変数類 | 静的限定公開変数類 | 非公開メンバ関数 | 全メンバ一覧
org.keycloak.social.github.GitHubIdentityProvider クラス
org.keycloak.social.github.GitHubIdentityProvider の継承関係図
Inheritance graph
org.keycloak.social.github.GitHubIdentityProvider 連携図
Collaboration graph

公開メンバ関数

 GitHubIdentityProvider (KeycloakSession session, OAuth2IdentityProviderConfig config)
 
Object callback (RealmModel realm, AuthenticationCallback callback, EventBuilder event)
 
Response performLogin (AuthenticationRequest request)
 
Response retrieveToken (KeycloakSession session, FederatedIdentityModel identity)
 
getConfig ()
 
Response exchangeFromToken (UriInfo uriInfo, EventBuilder event, ClientModel authorizedClient, UserSessionModel tokenUserSession, UserModel tokenSubject, MultivaluedMap< String, String > params)
 
BrokeredIdentityContext getFederatedIdentity (String response)
 
String getJsonProperty (JsonNode jsonNode, String name)
 
JsonNode asJsonNode (String json) throws IOException
 
void authenticationFinished (AuthenticationSessionModel authSession, BrokeredIdentityContext context)
 
boolean isIssuer (String issuer, MultivaluedMap< String, String > params)
 
final BrokeredIdentityContext exchangeExternal (EventBuilder event, MultivaluedMap< String, String > params)
 
void exchangeExternalComplete (UserSessionModel userSession, BrokeredIdentityContext context, MultivaluedMap< String, String > params)
 
Response export (UriInfo uriInfo, RealmModel realm, String format)
 
void close ()
 
Response keycloakInitiatedBrowserLogout (KeycloakSession session, UserSessionModel userSession, UriInfo uriInfo, RealmModel realm)
 
void backchannelLogout (KeycloakSession session, UserSessionModel userSession, UriInfo uriInfo, RealmModel realm)
 
Response exchangeNotSupported ()
 
Response exchangeNotLinked (UriInfo uriInfo, ClientModel authorizedClient, UserSessionModel tokenUserSession, UserModel tokenSubject)
 
Response exchangeNotLinkedNoStore (UriInfo uriInfo, ClientModel authorizedClient, UserSessionModel tokenUserSession, UserModel tokenSubject)
 
Response exchangeTokenExpired (UriInfo uriInfo, ClientModel authorizedClient, UserSessionModel tokenUserSession, UserModel tokenSubject)
 
Response exchangeUnsupportedRequiredType ()
 
void preprocessFederatedIdentity (KeycloakSession session, RealmModel realm, BrokeredIdentityContext context)
 
void importNewUser (KeycloakSession session, RealmModel realm, UserModel user, BrokeredIdentityContext context)
 
void updateBrokeredUser (KeycloakSession session, RealmModel realm, UserModel user, BrokeredIdentityContext context)
 
IdentityProviderDataMarshaller getMarshaller ()
 
void preprocessFederatedIdentity (KeycloakSession session, RealmModel realm, BrokeredIdentityContext context)
 
void authenticationFinished (AuthenticationSessionModel authSession, BrokeredIdentityContext context)
 
void importNewUser (KeycloakSession session, RealmModel realm, UserModel user, BrokeredIdentityContext context)
 
void updateBrokeredUser (KeycloakSession session, RealmModel realm, UserModel user, BrokeredIdentityContext context)
 
Object callback (RealmModel realm, AuthenticationCallback callback, EventBuilder event)
 
Response performLogin (AuthenticationRequest request)
 
Response retrieveToken (KeycloakSession session, FederatedIdentityModel identity)
 
void backchannelLogout (KeycloakSession session, UserSessionModel userSession, UriInfo uriInfo, RealmModel realm)
 
Response keycloakInitiatedBrowserLogout (KeycloakSession session, UserSessionModel userSession, UriInfo uriInfo, RealmModel realm)
 
Response export (UriInfo uriInfo, RealmModel realm, String format)
 
IdentityProviderDataMarshaller getMarshaller ()
 
void close ()
 

公開変数類

String EXTERNAL_IDENTITY_PROVIDER
 
String FEDERATED_ACCESS_TOKEN
 
String EXTERNAL_IDENTITY_PROVIDER = "EXTERNAL_IDENTITY_PROVIDER"
 
String FEDERATED_ACCESS_TOKEN = "FEDERATED_ACCESS_TOKEN"
 

静的公開変数類

static final String AUTH_URL = "https://github.com/login/oauth/authorize"
 
static final String TOKEN_URL = "https://github.com/login/oauth/access_token"
 
static final String PROFILE_URL = "https://api.github.com/user"
 
static final String EMAIL_URL = "https://api.github.com/user/emails"
 
static final String DEFAULT_SCOPE = "user:email"
 
static final String OAUTH2_GRANT_TYPE_REFRESH_TOKEN = "refresh_token"
 
static final String OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE = "authorization_code"
 
static final String FEDERATED_REFRESH_TOKEN = "FEDERATED_REFRESH_TOKEN"
 
static final String FEDERATED_TOKEN_EXPIRATION = "FEDERATED_TOKEN_EXPIRATION"
 
static final String ACCESS_DENIED = "access_denied"
 
static final String OAUTH2_PARAMETER_ACCESS_TOKEN = "access_token"
 
static final String OAUTH2_PARAMETER_SCOPE = "scope"
 
static final String OAUTH2_PARAMETER_STATE = "state"
 
static final String OAUTH2_PARAMETER_RESPONSE_TYPE = "response_type"
 
static final String OAUTH2_PARAMETER_REDIRECT_URI = "redirect_uri"
 
static final String OAUTH2_PARAMETER_CODE = "code"
 
static final String OAUTH2_PARAMETER_CLIENT_ID = "client_id"
 
static final String OAUTH2_PARAMETER_CLIENT_SECRET = "client_secret"
 
static final String OAUTH2_PARAMETER_GRANT_TYPE = "grant_type"
 
static final String ACCOUNT_LINK_URL = "account-link-url"
 

限定公開メンバ関数

boolean supportsExternalExchange ()
 
String getProfileEndpointForValidation (EventBuilder event)
 
BrokeredIdentityContext extractIdentityFromProfile (EventBuilder event, JsonNode profile)
 
BrokeredIdentityContext doGetFederatedIdentity (String accessToken)
 
String getDefaultScopes ()
 
String extractTokenFromResponse (String response, String tokenName)
 
Response hasExternalExchangeToken (EventBuilder event, UserSessionModel tokenUserSession, MultivaluedMap< String, String > params)
 
Response exchangeStoredToken (UriInfo uriInfo, EventBuilder event, ClientModel authorizedClient, UserSessionModel tokenUserSession, UserModel tokenSubject)
 
Response exchangeSessionToken (UriInfo uriInfo, EventBuilder event, ClientModel authorizedClient, UserSessionModel tokenUserSession, UserModel tokenSubject)
 
String getAccessTokenResponseParameter ()
 
UriBuilder createAuthorizationUrl (AuthenticationRequest request)
 
BrokeredIdentityContext validateExternalTokenThroughUserInfo (EventBuilder event, String subjectToken, String subjectTokenType)
 
SimpleHttp buildUserInfoRequest (String subjectToken, String userInfoUrl)
 
BrokeredIdentityContext exchangeExternalImpl (EventBuilder event, MultivaluedMap< String, String > params)
 
BrokeredIdentityContext exchangeExternalUserInfoValidationOnly (EventBuilder event, MultivaluedMap< String, String > params)
 
Response exchangeErrorResponse (UriInfo uriInfo, ClientModel authorizedClient, UserSessionModel tokenUserSession, String errorCode, String reason)
 
String getLinkingUrl (UriInfo uriInfo, ClientModel authorizedClient, UserSessionModel tokenUserSession)
 

限定公開変数類

final KeycloakSession session
 

静的限定公開変数類

static final Logger logger = Logger.getLogger(AbstractOAuth2IdentityProvider.class)
 
static ObjectMapper mapper = new ObjectMapper()
 

非公開メンバ関数

String searchEmail (String accessToken)
 

詳解

著者
Stian Thorgersen

構築子と解体子

◆ GitHubIdentityProvider()

org.keycloak.social.github.GitHubIdentityProvider.GitHubIdentityProvider ( KeycloakSession  session,
OAuth2IdentityProviderConfig  config 
)
inline
44  {
45  super(session, config);
46  config.setAuthorizationUrl(AUTH_URL);
47  config.setTokenUrl(TOKEN_URL);
48  config.setUserInfoUrl(PROFILE_URL);
49  }
final C config
Definition: AbstractIdentityProvider.java:48
static final String TOKEN_URL
Definition: GitHubIdentityProvider.java:39
static final String PROFILE_URL
Definition: GitHubIdentityProvider.java:40
static final String AUTH_URL
Definition: GitHubIdentityProvider.java:38
final KeycloakSession session
Definition: AbstractIdentityProvider.java:47

関数詳解

◆ asJsonNode()

JsonNode org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.asJsonNode ( String  json) throws IOException
inlineinherited
370  {
371  return mapper.readTree(json);
372  }
static ObjectMapper mapper
Definition: AbstractOAuth2IdentityProvider.java:83

◆ authenticationFinished() [1/2]

void org.keycloak.broker.provider.IdentityProvider< C extends IdentityProviderModel >.authenticationFinished ( AuthenticationSessionModel  authSession,
BrokeredIdentityContext  context 
)
inherited

◆ authenticationFinished() [2/2]

void org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.authenticationFinished ( AuthenticationSessionModel  authSession,
BrokeredIdentityContext  context 
)
inlineinherited
377  {
378  String token = (String) context.getContextData().get(FEDERATED_ACCESS_TOKEN);
379  if (token != null) authSession.setUserSessionNote(FEDERATED_ACCESS_TOKEN, token);
380  }
String FEDERATED_ACCESS_TOKEN
Definition: IdentityProvider.java:38

◆ backchannelLogout() [1/2]

void org.keycloak.broker.provider.AbstractIdentityProvider< C extends IdentityProviderModel >.backchannelLogout ( KeycloakSession  session,
UserSessionModel  userSession,
UriInfo  uriInfo,
RealmModel  realm 
)
inlineinherited
85  {
86 
87  }

◆ backchannelLogout() [2/2]

void org.keycloak.broker.provider.IdentityProvider< C extends IdentityProviderModel >.backchannelLogout ( KeycloakSession  session,
UserSessionModel  userSession,
UriInfo  uriInfo,
RealmModel  realm 
)
inherited

◆ buildUserInfoRequest()

SimpleHttp org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.buildUserInfoRequest ( String  subjectToken,
String  userInfoUrl 
)
inlineprotectedinherited
500  {
501  return SimpleHttp.doGet(userInfoUrl, session)
502  .header("Authorization", "Bearer " + subjectToken);
503  }
final KeycloakSession session
Definition: AbstractIdentityProvider.java:47

◆ callback() [1/2]

Object org.keycloak.broker.provider.IdentityProvider< C extends IdentityProviderModel >.callback ( RealmModel  realm,
AuthenticationCallback  callback,
EventBuilder  event 
)
inherited

JAXRS callback endpoint for when the remote IDP wants to callback to keycloak.

戻り値

org.keycloak.social.twitter.TwitterIdentityProviderで実装されています。

◆ callback() [2/2]

Object org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.callback ( RealmModel  realm,
AuthenticationCallback  callback,
EventBuilder  event 
)
inlineinherited
105  {
106  return new Endpoint(callback, realm, event);
107  }
Object callback(RealmModel realm, AuthenticationCallback callback, EventBuilder event)
Definition: AbstractOAuth2IdentityProvider.java:105

◆ close() [1/2]

void org.keycloak.provider.Provider.close ( )
inherited

org.keycloak.models.sessions.infinispan.InfinispanUserSessionProvider, org.keycloak.storage.UserStorageManager, org.keycloak.protocol.saml.SamlProtocol, org.keycloak.storage.ldap.LDAPStorageProvider, org.keycloak.forms.login.freemarker.FreeMarkerLoginFormsProvider, org.keycloak.models.cache.infinispan.RealmCacheSession, org.keycloak.models.jpa.JpaUserProvider, org.keycloak.models.cache.infinispan.UserCacheSession, org.keycloak.forms.account.freemarker.FreeMarkerAccountProvider, org.keycloak.protocol.oidc.OIDCLoginProtocol, org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider, org.keycloak.credential.UserCredentialStoreManager, org.keycloak.services.managers.DefaultBruteForceProtector, org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProvider, org.keycloak.email.freemarker.FreeMarkerEmailTemplateProvider, org.keycloak.protocol.saml.EntityDescriptorDescriptionConverter, org.keycloak.federation.kerberos.KerberosFederationProvider, org.keycloak.models.jpa.JpaUserCredentialStore, org.keycloak.storage.ClientStorageManager, org.keycloak.keys.infinispan.InfinispanPublicKeyStorageProvider, org.keycloak.models.sessions.infinispan.InfinispanAuthenticationSessionProvider, org.keycloak.services.clientregistration.AbstractClientRegistrationProvider, org.keycloak.authentication.authenticators.x509.AbstractX509ClientCertificateAuthenticator, org.keycloak.authentication.authenticators.resetcred.ResetCredentialEmail, org.keycloak.authentication.forms.RegistrationRecaptcha, org.keycloak.authentication.authenticators.browser.ScriptBasedAuthenticator, org.keycloak.email.DefaultEmailSenderProvider, org.keycloak.models.jpa.JpaRealmProvider, org.keycloak.exportimport.dir.DirImportProvider, org.keycloak.protocol.docker.DockerAuthV2Protocol, org.keycloak.authentication.authenticators.browser.SpnegoAuthenticator, org.keycloak.authorization.AuthorizationProvider, org.keycloak.authentication.authenticators.resetcred.ResetCredentialChooseUser, org.keycloak.authentication.forms.RegistrationUserCreation, org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider, org.keycloak.theme.ExtendingThemeManager, org.keycloak.protocol.saml.installation.KeycloakSamlClientInstallation, org.keycloak.models.cache.infinispan.authorization.StoreFactoryCacheSession, org.keycloak.protocol.saml.installation.SamlIDPDescriptorClientInstallation, org.keycloak.authentication.authenticators.challenge.BasicAuthAuthenticator, org.keycloak.authentication.authenticators.cli.CliUsernamePasswordAuthenticator, org.keycloak.protocol.oidc.installation.KeycloakOIDCClientInstallation, org.keycloak.authentication.forms.RegistrationProfile, org.keycloak.authentication.requiredactions.UpdatePassword, org.keycloak.authentication.requiredactions.UpdateProfile, org.keycloak.protocol.saml.mappers.RoleNameMapper, org.keycloak.authentication.forms.RegistrationPassword, org.keycloak.protocol.oidc.OIDCWellKnownProvider, org.keycloak.events.log.JBossLoggingEventListenerProvider, org.keycloak.protocol.saml.profile.ecp.authenticator.HttpBasicAuthenticator, org.keycloak.connections.jpa.updater.liquibase.conn.DefaultLiquibaseConnectionProvider, org.keycloak.authentication.authenticators.console.ConsoleUsernamePasswordAuthenticator, org.keycloak.authentication.authenticators.broker.AbstractIdpAuthenticator, org.keycloak.protocol.saml.installation.ModAuthMellonClientInstallation, org.keycloak.authentication.authenticators.browser.IdentityProviderAuthenticator, org.keycloak.credential.hash.Pbkdf2PasswordHashProvider, org.keycloak.events.jpa.JpaEventStoreProvider, org.keycloak.authentication.authenticators.browser.UsernamePasswordForm, org.keycloak.authentication.authenticators.browser.OTPFormAuthenticator, org.keycloak.authentication.requiredactions.ConsoleUpdateTotp, org.keycloak.authentication.requiredactions.ConsoleVerifyEmail, org.keycloak.authentication.requiredactions.VerifyEmail, org.keycloak.authentication.requiredactions.TermsAndConditions, org.keycloak.authorization.protection.introspect.RPTIntrospectionProvider, org.keycloak.protocol.oidc.installation.KeycloakOIDCJbossSubsystemClientInstallation, org.keycloak.authentication.requiredactions.UpdateTotp, org.keycloak.models.UserProvider, org.keycloak.exportimport.dir.DirExportProvider, org.keycloak.models.UserSessionProvider, org.keycloak.scripting.DefaultScriptingProvider, org.keycloak.protocol.oidc.AccessTokenIntrospectionProvider, org.keycloak.protocol.saml.installation.SamlSPDescriptorClientInstallation, org.keycloak.exportimport.singlefile.SingleFileExportProvider, org.keycloak.exportimport.singlefile.SingleFileImportProvider, org.keycloak.policy.HashIterationsPasswordPolicyProviderFactory, org.keycloak.services.migration.DefaultMigrationProvider, org.keycloak.authentication.authenticators.resetcred.AbstractSetRequiredActionAuthenticator, org.keycloak.storage.ldap.mappers.AbstractLDAPStorageMapper, org.keycloak.services.clientregistration.AdapterInstallationClientRegistrationProvider, org.keycloak.timer.basic.BasicTimerProvider, org.keycloak.theme.FolderThemeProvider, org.keycloak.models.RealmProvider, org.keycloak.policy.HistoryPasswordPolicyProvider, org.keycloak.protocol.saml.installation.KeycloakSamlSubsystemInstallation, org.keycloak.storage.jpa.JpaUserFederatedStorageProvider, org.keycloak.authentication.authenticators.browser.CookieAuthenticator, org.keycloak.keys.AbstractGeneratedSecretKeyProvider, org.keycloak.authorization.jpa.store.JPAStoreFactory, org.keycloak.events.email.EmailEventListenerProvider, org.keycloak.authentication.authenticators.challenge.NoCookieFlowRedirectAuthenticator, org.keycloak.policy.BlacklistPasswordPolicyProvider, org.keycloak.authentication.authenticators.console.ConsoleOTPFormAuthenticator, org.keycloak.authentication.requiredactions.ConsoleTermsAndConditions, org.keycloak.models.sessions.infinispan.InfinispanCodeToTokenStoreProvider, org.keycloak.policy.RegexPatternsPasswordPolicyProvider, org.keycloak.models.sessions.infinispan.InfinispanStickySessionEncoderProvider, org.keycloak.cluster.infinispan.InfinispanClusterProvider, org.keycloak.authentication.requiredactions.ConsoleUpdateProfile, org.keycloak.exportimport.KeycloakClientDescriptionConverter, org.keycloak.policy.DefaultPasswordPolicyManagerProvider, org.keycloak.services.x509.AbstractClientCertificateFromHttpHeadersLookup, org.keycloak.theme.ClasspathThemeProvider, org.keycloak.policy.DigitsPasswordPolicyProvider, org.keycloak.policy.LowerCasePasswordPolicyProvider, org.keycloak.policy.SpecialCharsPasswordPolicyProvider, org.keycloak.policy.UpperCasePasswordPolicyProvider, org.keycloak.models.session.DisabledUserSessionPersisterProvider, org.keycloak.policy.NotUsernamePasswordPolicyProvider, org.keycloak.theme.DefaultThemeSelectorProvider, org.keycloak.connections.infinispan.DefaultInfinispanConnectionProvider, org.keycloak.provider.ExceptionConverter, org.keycloak.policy.LengthPasswordPolicyProvider, org.keycloak.authentication.forms.RegistrationPage, org.keycloak.protocol.oidc.OIDCClientDescriptionConverter, org.keycloak.theme.ClasspathThemeResourceProviderFactory, org.keycloak.policy.HashAlgorithmPasswordPolicyProviderFactory, org.keycloak.models.sessions.infinispan.InfinispanActionTokenStoreProvider, org.keycloak.authentication.authenticators.x509.X509ClientCertificateAuthenticator, org.keycloak.locale.DefaultLocaleSelectorProvider, org.keycloak.policy.ForceExpiredPasswordPolicyProviderFactory, org.keycloak.authentication.authenticators.directgrant.AbstractDirectGrantAuthenticator, org.keycloak.protocol.docker.installation.DockerComposeYamlInstallationProvider, org.keycloak.truststore.FileTruststoreProvider, org.keycloak.protocol.oidc.mappers.AbstractOIDCProtocolMapper, org.keycloak.authentication.authenticators.AttemptedAuthenticator, org.keycloak.authorization.policy.provider.drools.DroolsPolicyProvider, org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy, org.keycloak.services.x509.DefaultClientCertificateLookup, org.keycloak.connections.jpa.DefaultJpaConnectionProvider, org.keycloak.authorization.config.UmaWellKnownProvider, org.keycloak.protocol.saml.mappers.AbstractSAMLProtocolMapper, org.keycloak.urls.HostnameProvider, org.keycloak.authentication.authenticators.client.AbstractClientAuthenticator, org.keycloak.keys.KeyProvider, org.keycloak.protocol.docker.installation.DockerRegistryConfigFileInstallationProvider, org.keycloak.protocol.docker.installation.DockerVariableOverrideInstallationProvider, org.keycloak.protocol.docker.mapper.DockerAuthV2ProtocolMapper, org.keycloak.transaction.JtaTransactionManagerLookup, org.keycloak.broker.provider.AbstractIdentityProviderMapper, org.keycloak.authentication.AbstractFormAuthenticator, org.keycloak.crypto.SignatureProvider, org.keycloak.credential.CredentialProvider, org.keycloak.protocol.oidc.ext.OIDCExtProvider (計143項目)で実装されています。

◆ close() [2/2]

65  {
66  // no-op
67  }

◆ createAuthorizationUrl()

UriBuilder org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.createAuthorizationUrl ( AuthenticationRequest  request)
inlineprotectedinherited
303  {
304  final UriBuilder uriBuilder = UriBuilder.fromUri(getConfig().getAuthorizationUrl())
305  .queryParam(OAUTH2_PARAMETER_SCOPE, getConfig().getDefaultScope())
306  .queryParam(OAUTH2_PARAMETER_STATE, request.getState().getEncoded())
307  .queryParam(OAUTH2_PARAMETER_RESPONSE_TYPE, "code")
308  .queryParam(OAUTH2_PARAMETER_CLIENT_ID, getConfig().getClientId())
309  .queryParam(OAUTH2_PARAMETER_REDIRECT_URI, request.getRedirectUri());
310 
311  String loginHint = request.getAuthenticationSession().getClientNote(OIDCLoginProtocol.LOGIN_HINT_PARAM);
312  if (getConfig().isLoginHint() && loginHint != null) {
313  uriBuilder.queryParam(OIDCLoginProtocol.LOGIN_HINT_PARAM, loginHint);
314  }
315 
316  if (getConfig().isUiLocales()) {
317  uriBuilder.queryParam(OIDCLoginProtocol.UI_LOCALES_PARAM, session.getContext().resolveLocale(null).toLanguageTag());
318  }
319 
320  String prompt = getConfig().getPrompt();
321  if (prompt == null || prompt.isEmpty()) {
322  prompt = request.getAuthenticationSession().getClientNote(OAuth2Constants.PROMPT);
323  }
324  if (prompt != null) {
325  uriBuilder.queryParam(OAuth2Constants.PROMPT, prompt);
326  }
327 
328  String nonce = request.getAuthenticationSession().getClientNote(OIDCLoginProtocol.NONCE_PARAM);
329  if (nonce == null || nonce.isEmpty()) {
330  nonce = UUID.randomUUID().toString();
331  request.getAuthenticationSession().setClientNote(OIDCLoginProtocol.NONCE_PARAM, nonce);
332  }
333  uriBuilder.queryParam(OIDCLoginProtocol.NONCE_PARAM, nonce);
334 
335  String acr = request.getAuthenticationSession().getClientNote(OAuth2Constants.ACR_VALUES);
336  if (acr != null) {
337  uriBuilder.queryParam(OAuth2Constants.ACR_VALUES, acr);
338  }
339  String forwardParameterConfig = getConfig().getForwardParameters() != null ? getConfig().getForwardParameters(): "";
340  List<String> forwardParameters = Arrays.asList(forwardParameterConfig.split("\\s*,\\s*"));
341  for(String forwardParameter: forwardParameters) {
342  String name = AuthorizationEndpoint.LOGIN_SESSION_NOTE_ADDITIONAL_REQ_PARAMS_PREFIX + forwardParameter.trim();
343  String parameter = request.getAuthenticationSession().getClientNote(name);
344  if(parameter != null && !parameter.isEmpty()) {
345  uriBuilder.queryParam(forwardParameter, parameter);
346  }
347  }
348  return uriBuilder;
349  }
static final String OAUTH2_PARAMETER_CLIENT_ID
Definition: AbstractOAuth2IdentityProvider.java:91
C getConfig()
Definition: AbstractOAuth2IdentityProvider.java:126
static final String OAUTH2_PARAMETER_SCOPE
Definition: AbstractOAuth2IdentityProvider.java:86
static final String OAUTH2_PARAMETER_REDIRECT_URI
Definition: AbstractOAuth2IdentityProvider.java:89
static final String OAUTH2_PARAMETER_STATE
Definition: AbstractOAuth2IdentityProvider.java:87
static final String OAUTH2_PARAMETER_RESPONSE_TYPE
Definition: AbstractOAuth2IdentityProvider.java:88
final KeycloakSession session
Definition: AbstractIdentityProvider.java:47
Locale resolveLocale(UserModel user)

◆ doGetFederatedIdentity()

BrokeredIdentityContext org.keycloak.social.github.GitHubIdentityProvider.doGetFederatedIdentity ( String  accessToken)
inlineprotected
80  {
81  try {
82  JsonNode profile = SimpleHttp.doGet(PROFILE_URL, session).header("Authorization", "Bearer " + accessToken).asJson();
83 
84  BrokeredIdentityContext user = extractIdentityFromProfile(null, profile);
85 
86  if (user.getEmail() == null) {
87  user.setEmail(searchEmail(accessToken));
88  }
89 
90  return user;
91  } catch (Exception e) {
92  throw new IdentityBrokerException("Could not obtain user profile from github.", e);
93  }
94  }
BrokeredIdentityContext extractIdentityFromProfile(EventBuilder event, JsonNode profile)
Definition: GitHubIdentityProvider.java:62
static final String PROFILE_URL
Definition: GitHubIdentityProvider.java:40
String searchEmail(String accessToken)
Definition: GitHubIdentityProvider.java:96
final KeycloakSession session
Definition: AbstractIdentityProvider.java:47

◆ exchangeErrorResponse()

Response org.keycloak.broker.provider.AbstractIdentityProvider< C extends IdentityProviderModel >.exchangeErrorResponse ( UriInfo  uriInfo,
ClientModel  authorizedClient,
UserSessionModel  tokenUserSession,
String  errorCode,
String  reason 
)
inlineprotectedinherited
104  {
105  Map<String, String> error = new HashMap<>();
106  error.put("error", errorCode);
107  error.put("error_description", reason);
108  String accountLinkUrl = getLinkingUrl(uriInfo, authorizedClient, tokenUserSession);
109  if (accountLinkUrl != null) error.put(ACCOUNT_LINK_URL, accountLinkUrl);
110  return Response.status(400).entity(error).type(MediaType.APPLICATION_JSON_TYPE).build();
111  }
String getLinkingUrl(UriInfo uriInfo, ClientModel authorizedClient, UserSessionModel tokenUserSession)
Definition: AbstractIdentityProvider.java:113
static final String ACCOUNT_LINK_URL
Definition: AbstractIdentityProvider.java:46

◆ exchangeExternal()

final BrokeredIdentityContext org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.exchangeExternal ( EventBuilder  event,
MultivaluedMap< String, String >  params 
)
inlineinherited

org.keycloak.broker.provider.ExchangeExternalTokenを実装しています。

519  {
520  if (!supportsExternalExchange()) return null;
521  BrokeredIdentityContext context = exchangeExternalImpl(event, params);
522  if (context != null) {
523  context.setIdp(this);
524  context.setIdpConfig(getConfig());
525  }
526  return context;
527  }
C getConfig()
Definition: AbstractOAuth2IdentityProvider.java:126
boolean supportsExternalExchange()
Definition: AbstractOAuth2IdentityProvider.java:506
BrokeredIdentityContext exchangeExternalImpl(EventBuilder event, MultivaluedMap< String, String > params)
Definition: AbstractOAuth2IdentityProvider.java:529

◆ exchangeExternalComplete()

void org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.exchangeExternalComplete ( UserSessionModel  userSession,
BrokeredIdentityContext  context,
MultivaluedMap< String, String >  params 
)
inlineinherited

org.keycloak.broker.provider.ExchangeExternalTokenを実装しています。

554  {
555  if (context.getContextData().containsKey(OIDCIdentityProvider.VALIDATED_ID_TOKEN))
556  userSession.setNote(FEDERATED_ACCESS_TOKEN, params.getFirst(OAuth2Constants.SUBJECT_TOKEN));
557  if (context.getContextData().containsKey(OIDCIdentityProvider.VALIDATED_ID_TOKEN))
558  userSession.setNote(OIDCIdentityProvider.FEDERATED_ID_TOKEN, params.getFirst(OAuth2Constants.SUBJECT_TOKEN));
559  userSession.setNote(OIDCIdentityProvider.EXCHANGE_PROVIDER, getConfig().getAlias());
560 
561  }
C getConfig()
Definition: AbstractOAuth2IdentityProvider.java:126
String FEDERATED_ACCESS_TOKEN
Definition: IdentityProvider.java:38

◆ exchangeExternalImpl()

BrokeredIdentityContext org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.exchangeExternalImpl ( EventBuilder  event,
MultivaluedMap< String, String >  params 
)
inlineprotectedinherited
529  {
530  return exchangeExternalUserInfoValidationOnly(event, params);
531 
532  }
BrokeredIdentityContext exchangeExternalUserInfoValidationOnly(EventBuilder event, MultivaluedMap< String, String > params)
Definition: AbstractOAuth2IdentityProvider.java:534

◆ exchangeExternalUserInfoValidationOnly()

BrokeredIdentityContext org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.exchangeExternalUserInfoValidationOnly ( EventBuilder  event,
MultivaluedMap< String, String >  params 
)
inlineprotectedinherited
534  {
535  String subjectToken = params.getFirst(OAuth2Constants.SUBJECT_TOKEN);
536  if (subjectToken == null) {
537  event.detail(Details.REASON, OAuth2Constants.SUBJECT_TOKEN + " param unset");
538  event.error(Errors.INVALID_TOKEN);
539  throw new ErrorResponseException(OAuthErrorException.INVALID_TOKEN, "token not set", Response.Status.BAD_REQUEST);
540  }
541  String subjectTokenType = params.getFirst(OAuth2Constants.SUBJECT_TOKEN_TYPE);
542  if (subjectTokenType == null) {
543  subjectTokenType = OAuth2Constants.ACCESS_TOKEN_TYPE;
544  }
545  if (!OAuth2Constants.ACCESS_TOKEN_TYPE.equals(subjectTokenType)) {
546  event.detail(Details.REASON, OAuth2Constants.SUBJECT_TOKEN_TYPE + " invalid");
547  event.error(Errors.INVALID_TOKEN_TYPE);
548  throw new ErrorResponseException(OAuthErrorException.INVALID_TOKEN, "invalid token type", Response.Status.BAD_REQUEST);
549  }
550  return validateExternalTokenThroughUserInfo(event, subjectToken, subjectTokenType);
551  }
BrokeredIdentityContext validateExternalTokenThroughUserInfo(EventBuilder event, String subjectToken, String subjectTokenType)
Definition: AbstractOAuth2IdentityProvider.java:466

◆ exchangeFromToken()

Response org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.exchangeFromToken ( UriInfo  uriInfo,
EventBuilder  event,
ClientModel  authorizedClient,
UserSessionModel  tokenUserSession,
UserModel  tokenSubject,
MultivaluedMap< String, String >  params 
)
inlineinherited

org.keycloak.broker.provider.ExchangeTokenToIdentityProviderTokenを実装しています。

160  {
161  // check to see if we have a token exchange in session
162  // in other words check to see if this session was created by an external exchange
163  Response tokenResponse = hasExternalExchangeToken(event, tokenUserSession, params);
164  if (tokenResponse != null) return tokenResponse;
165 
166  // going further we only support access token type? Why?
167  String requestedType = params.getFirst(OAuth2Constants.REQUESTED_TOKEN_TYPE);
168  if (requestedType != null && !requestedType.equals(OAuth2Constants.ACCESS_TOKEN_TYPE)) {
169  event.detail(Details.REASON, "requested_token_type unsupported");
170  event.error(Errors.INVALID_REQUEST);
172  }
173  if (!getConfig().isStoreToken()) {
174  // if token isn't stored, we need to see if this session has been linked
175  String brokerId = tokenUserSession.getNote(Details.IDENTITY_PROVIDER);
176  brokerId = brokerId == null ? tokenUserSession.getNote(IdentityProvider.EXTERNAL_IDENTITY_PROVIDER) : brokerId;
177  if (brokerId == null || !brokerId.equals(getConfig().getAlias())) {
178  event.detail(Details.REASON, "requested_issuer has not linked");
179  event.error(Errors.INVALID_REQUEST);
180  return exchangeNotLinkedNoStore(uriInfo, authorizedClient, tokenUserSession, tokenSubject);
181  }
182  return exchangeSessionToken(uriInfo, event, authorizedClient, tokenUserSession, tokenSubject);
183  } else {
184  return exchangeStoredToken(uriInfo, event, authorizedClient, tokenUserSession, tokenSubject);
185  }
186  }
Response exchangeSessionToken(UriInfo uriInfo, EventBuilder event, ClientModel authorizedClient, UserSessionModel tokenUserSession, UserModel tokenSubject)
Definition: AbstractOAuth2IdentityProvider.java:261
C getConfig()
Definition: AbstractOAuth2IdentityProvider.java:126
Response exchangeNotLinkedNoStore(UriInfo uriInfo, ClientModel authorizedClient, UserSessionModel tokenUserSession, UserModel tokenSubject)
Definition: AbstractIdentityProvider.java:100
Response exchangeUnsupportedRequiredType()
Definition: AbstractIdentityProvider.java:139
Response exchangeStoredToken(UriInfo uriInfo, EventBuilder event, ClientModel authorizedClient, UserSessionModel tokenUserSession, UserModel tokenSubject)
Definition: AbstractOAuth2IdentityProvider.java:234
Response hasExternalExchangeToken(EventBuilder event, UserSessionModel tokenUserSession, MultivaluedMap< String, String > params)
Definition: AbstractOAuth2IdentityProvider.java:195

◆ exchangeNotLinked()

Response org.keycloak.broker.provider.AbstractIdentityProvider< C extends IdentityProviderModel >.exchangeNotLinked ( UriInfo  uriInfo,
ClientModel  authorizedClient,
UserSessionModel  tokenUserSession,
UserModel  tokenSubject 
)
inlineinherited
96  {
97  return exchangeErrorResponse(uriInfo, authorizedClient, tokenUserSession, "not_linked", "identity provider is not linked");
98  }
Response exchangeErrorResponse(UriInfo uriInfo, ClientModel authorizedClient, UserSessionModel tokenUserSession, String errorCode, String reason)
Definition: AbstractIdentityProvider.java:104

◆ exchangeNotLinkedNoStore()

Response org.keycloak.broker.provider.AbstractIdentityProvider< C extends IdentityProviderModel >.exchangeNotLinkedNoStore ( UriInfo  uriInfo,
ClientModel  authorizedClient,
UserSessionModel  tokenUserSession,
UserModel  tokenSubject 
)
inlineinherited
100  {
101  return exchangeErrorResponse(uriInfo, authorizedClient, tokenUserSession, "not_linked", "identity provider is not linked, can only link to current user session");
102  }
Response exchangeErrorResponse(UriInfo uriInfo, ClientModel authorizedClient, UserSessionModel tokenUserSession, String errorCode, String reason)
Definition: AbstractIdentityProvider.java:104

◆ exchangeNotSupported()

Response org.keycloak.broker.provider.AbstractIdentityProvider< C extends IdentityProviderModel >.exchangeNotSupported ( )
inlineinherited
89  {
90  Map<String, String> error = new HashMap<>();
91  error.put("error", "invalid_target");
92  error.put("error_description", "target_exchange_unsupported");
93  return Response.status(400).entity(error).type(MediaType.APPLICATION_JSON_TYPE).build();
94  }

◆ exchangeSessionToken()

Response org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.exchangeSessionToken ( UriInfo  uriInfo,
EventBuilder  event,
ClientModel  authorizedClient,
UserSessionModel  tokenUserSession,
UserModel  tokenSubject 
)
inlineprotectedinherited
261  {
262  String accessToken = tokenUserSession.getNote(FEDERATED_ACCESS_TOKEN);
263  if (accessToken == null) {
264  event.detail(Details.REASON, "requested_issuer is not linked");
265  event.error(Errors.INVALID_TOKEN);
266  return exchangeTokenExpired(uriInfo, authorizedClient, tokenUserSession, tokenSubject);
267  }
268  AccessTokenResponse tokenResponse = new AccessTokenResponse();
269  tokenResponse.setToken(accessToken);
270  tokenResponse.setIdToken(null);
271  tokenResponse.setRefreshToken(null);
272  tokenResponse.setRefreshExpiresIn(0);
273  tokenResponse.getOtherClaims().clear();
274  tokenResponse.getOtherClaims().put(OAuth2Constants.ISSUED_TOKEN_TYPE, OAuth2Constants.ACCESS_TOKEN_TYPE);
275  tokenResponse.getOtherClaims().put(ACCOUNT_LINK_URL, getLinkingUrl(uriInfo, authorizedClient, tokenUserSession));
276  event.success();
277  return Response.ok(tokenResponse).type(MediaType.APPLICATION_JSON_TYPE).build();
278  }
String getLinkingUrl(UriInfo uriInfo, ClientModel authorizedClient, UserSessionModel tokenUserSession)
Definition: AbstractIdentityProvider.java:113
Response exchangeTokenExpired(UriInfo uriInfo, ClientModel authorizedClient, UserSessionModel tokenUserSession, UserModel tokenSubject)
Definition: AbstractIdentityProvider.java:135
static final String ACCOUNT_LINK_URL
Definition: AbstractIdentityProvider.java:46
String FEDERATED_ACCESS_TOKEN
Definition: IdentityProvider.java:38

◆ exchangeStoredToken()

Response org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.exchangeStoredToken ( UriInfo  uriInfo,
EventBuilder  event,
ClientModel  authorizedClient,
UserSessionModel  tokenUserSession,
UserModel  tokenSubject 
)
inlineprotectedinherited
234  {
235  FederatedIdentityModel model = session.users().getFederatedIdentity(tokenSubject, getConfig().getAlias(), authorizedClient.getRealm());
236  if (model == null || model.getToken() == null) {
237  event.detail(Details.REASON, "requested_issuer is not linked");
238  event.error(Errors.INVALID_TOKEN);
239  return exchangeNotLinked(uriInfo, authorizedClient, tokenUserSession, tokenSubject);
240  }
241  String accessToken = extractTokenFromResponse(model.getToken(), getAccessTokenResponseParameter());
242  if (accessToken == null) {
243  model.setToken(null);
244  session.users().updateFederatedIdentity(authorizedClient.getRealm(), tokenSubject, model);
245  event.detail(Details.REASON, "requested_issuer token expired");
246  event.error(Errors.INVALID_TOKEN);
247  return exchangeTokenExpired(uriInfo, authorizedClient, tokenUserSession, tokenSubject);
248  }
249  AccessTokenResponse tokenResponse = new AccessTokenResponse();
250  tokenResponse.setToken(accessToken);
251  tokenResponse.setIdToken(null);
252  tokenResponse.setRefreshToken(null);
253  tokenResponse.setRefreshExpiresIn(0);
254  tokenResponse.getOtherClaims().clear();
255  tokenResponse.getOtherClaims().put(OAuth2Constants.ISSUED_TOKEN_TYPE, OAuth2Constants.ACCESS_TOKEN_TYPE);
256  tokenResponse.getOtherClaims().put(ACCOUNT_LINK_URL, getLinkingUrl(uriInfo, authorizedClient, tokenUserSession));
257  event.success();
258  return Response.ok(tokenResponse).type(MediaType.APPLICATION_JSON_TYPE).build();
259  }
FederatedIdentityModel getFederatedIdentity(UserModel user, String socialProvider, RealmModel realm)
C getConfig()
Definition: AbstractOAuth2IdentityProvider.java:126
String getLinkingUrl(UriInfo uriInfo, ClientModel authorizedClient, UserSessionModel tokenUserSession)
Definition: AbstractIdentityProvider.java:113
Response exchangeTokenExpired(UriInfo uriInfo, ClientModel authorizedClient, UserSessionModel tokenUserSession, UserModel tokenSubject)
Definition: AbstractIdentityProvider.java:135
void updateFederatedIdentity(RealmModel realm, UserModel federatedUser, FederatedIdentityModel federatedIdentityModel)
String getAccessTokenResponseParameter()
Definition: AbstractOAuth2IdentityProvider.java:293
String extractTokenFromResponse(String response, String tokenName)
Definition: AbstractOAuth2IdentityProvider.java:130
static final String ACCOUNT_LINK_URL
Definition: AbstractIdentityProvider.java:46
final KeycloakSession session
Definition: AbstractIdentityProvider.java:47
Response exchangeNotLinked(UriInfo uriInfo, ClientModel authorizedClient, UserSessionModel tokenUserSession, UserModel tokenSubject)
Definition: AbstractIdentityProvider.java:96

◆ exchangeTokenExpired()

Response org.keycloak.broker.provider.AbstractIdentityProvider< C extends IdentityProviderModel >.exchangeTokenExpired ( UriInfo  uriInfo,
ClientModel  authorizedClient,
UserSessionModel  tokenUserSession,
UserModel  tokenSubject 
)
inlineinherited
135  {
136  return exchangeErrorResponse(uriInfo, authorizedClient, tokenUserSession, "token_expired", "linked token is expired");
137  }
Response exchangeErrorResponse(UriInfo uriInfo, ClientModel authorizedClient, UserSessionModel tokenUserSession, String errorCode, String reason)
Definition: AbstractIdentityProvider.java:104

◆ exchangeUnsupportedRequiredType()

Response org.keycloak.broker.provider.AbstractIdentityProvider< C extends IdentityProviderModel >.exchangeUnsupportedRequiredType ( )
inlineinherited
139  {
140  Map<String, String> error = new HashMap<>();
141  error.put("error", "invalid_target");
142  error.put("error_description", "response_token_type_unsupported");
143  return Response.status(400).entity(error).type(MediaType.APPLICATION_JSON_TYPE).build();
144  }

◆ export() [1/2]

Response org.keycloak.broker.provider.AbstractIdentityProvider< C extends IdentityProviderModel >.export ( UriInfo  uriInfo,
RealmModel  realm,
String  format 
)
inlineinherited
60  {
61  return Response.noContent().build();
62  }

◆ export() [2/2]

Response org.keycloak.broker.provider.IdentityProvider< C extends IdentityProviderModel >.export ( UriInfo  uriInfo,
RealmModel  realm,
String  format 
)
inherited

Export a representation of the IdentityProvider in a specific format. For example, a SAML EntityDescriptor

戻り値

◆ extractIdentityFromProfile()

BrokeredIdentityContext org.keycloak.social.github.GitHubIdentityProvider.extractIdentityFromProfile ( EventBuilder  event,
JsonNode  profile 
)
inlineprotected
62  {
63  BrokeredIdentityContext user = new BrokeredIdentityContext(getJsonProperty(profile, "id"));
64 
65  String username = getJsonProperty(profile, "login");
66  user.setUsername(username);
67  user.setName(getJsonProperty(profile, "name"));
68  user.setEmail(getJsonProperty(profile, "email"));
69  user.setIdpConfig(getConfig());
70  user.setIdp(this);
71 
72  AbstractJsonUserAttributeMapper.storeUserProfileForMapper(user, profile, getConfig().getAlias());
73 
74  return user;
75 
76  }
C getConfig()
Definition: AbstractOAuth2IdentityProvider.java:126
String getJsonProperty(JsonNode jsonNode, String name)
Definition: AbstractOAuth2IdentityProvider.java:358

◆ extractTokenFromResponse()

String org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.extractTokenFromResponse ( String  response,
String  tokenName 
)
inlineprotectedinherited
130  {
131  if(response == null)
132  return null;
133 
134  if (response.startsWith("{")) {
135  try {
136  JsonNode node = mapper.readTree(response);
137  if(node.has(tokenName)){
138  String s = node.get(tokenName).textValue();
139  if(s == null || s.trim().isEmpty())
140  return null;
141  return s;
142  } else {
143  return null;
144  }
145  } catch (IOException e) {
146  throw new IdentityBrokerException("Could not extract token [" + tokenName + "] from response [" + response + "] due: " + e.getMessage(), e);
147  }
148  } else {
149  Matcher matcher = Pattern.compile(tokenName + "=([^&]+)").matcher(response);
150 
151  if (matcher.find()) {
152  return matcher.group(1);
153  }
154  }
155 
156  return null;
157  }
static ObjectMapper mapper
Definition: AbstractOAuth2IdentityProvider.java:83

◆ getAccessTokenResponseParameter()

String org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.getAccessTokenResponseParameter ( )
inlineprotectedinherited
293  {
295  }
static final String OAUTH2_PARAMETER_ACCESS_TOKEN
Definition: AbstractOAuth2IdentityProvider.java:85

◆ getConfig()

126  {
127  return super.getConfig();
128  }

◆ getDefaultScopes()

String org.keycloak.social.github.GitHubIdentityProvider.getDefaultScopes ( )
inlineprotected
114  {
115  return DEFAULT_SCOPE;
116  }
static final String DEFAULT_SCOPE
Definition: GitHubIdentityProvider.java:42

◆ getFederatedIdentity()

BrokeredIdentityContext org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.getFederatedIdentity ( String  response)
inlineinherited
281  {
282  String accessToken = extractTokenFromResponse(response, getAccessTokenResponseParameter());
283 
284  if (accessToken == null) {
285  throw new IdentityBrokerException("No access token available in OAuth server response: " + response);
286  }
287 
288  BrokeredIdentityContext context = doGetFederatedIdentity(accessToken);
289  context.getContextData().put(FEDERATED_ACCESS_TOKEN, accessToken);
290  return context;
291  }
String getAccessTokenResponseParameter()
Definition: AbstractOAuth2IdentityProvider.java:293
String extractTokenFromResponse(String response, String tokenName)
Definition: AbstractOAuth2IdentityProvider.java:130
BrokeredIdentityContext doGetFederatedIdentity(String accessToken)
Definition: AbstractOAuth2IdentityProvider.java:298
String FEDERATED_ACCESS_TOKEN
Definition: IdentityProvider.java:38

◆ getJsonProperty()

String org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.getJsonProperty ( JsonNode  jsonNode,
String  name 
)
inlineinherited

Get JSON property as text. JSON numbers and booleans are converted to text. Empty string is converted to null.

引数
jsonNodeto get property from
nameof property to get
戻り値
string value of the property or null.
358  {
359  if (jsonNode.has(name) && !jsonNode.get(name).isNull()) {
360  String s = jsonNode.get(name).asText();
361  if(s != null && !s.isEmpty())
362  return s;
363  else
364  return null;
365  }
366 
367  return null;
368  }

◆ getLinkingUrl()

String org.keycloak.broker.provider.AbstractIdentityProvider< C extends IdentityProviderModel >.getLinkingUrl ( UriInfo  uriInfo,
ClientModel  authorizedClient,
UserSessionModel  tokenUserSession 
)
inlineprotectedinherited
113  {
114  String provider = getConfig().getAlias();
115  String clientId = authorizedClient.getClientId();
116  String nonce = UUID.randomUUID().toString();
117  MessageDigest md = null;
118  try {
119  md = MessageDigest.getInstance("SHA-256");
120  } catch (NoSuchAlgorithmException e) {
121  throw new RuntimeException(e);
122  }
123  String input = nonce + tokenUserSession.getId() + clientId + provider;
124  byte[] check = md.digest(input.getBytes(StandardCharsets.UTF_8));
125  String hash = Base64Url.encode(check);
126  return KeycloakUriBuilder.fromUri(uriInfo.getBaseUri())
127  .path("/realms/{realm}/broker/{provider}/link")
128  .queryParam("nonce", nonce)
129  .queryParam("hash", hash)
130  .queryParam("client_id", clientId)
131  .build(authorizedClient.getRealm().getName(), provider)
132  .toString();
133  }
C getConfig()
Definition: AbstractIdentityProvider.java:55

◆ getMarshaller() [1/2]

IdentityProviderDataMarshaller org.keycloak.broker.provider.IdentityProvider< C extends IdentityProviderModel >.getMarshaller ( )
inherited

Implementation of marshaller to serialize/deserialize attached data to Strings, which can be saved in clientSession

戻り値

◆ getMarshaller() [2/2]

IdentityProviderDataMarshaller org.keycloak.broker.provider.AbstractIdentityProvider< C extends IdentityProviderModel >.getMarshaller ( )
inlineinherited
167  {
168  return new DefaultDataMarshaller();
169  }

◆ getProfileEndpointForValidation()

String org.keycloak.social.github.GitHubIdentityProvider.getProfileEndpointForValidation ( EventBuilder  event)
inlineprotected
57  {
58  return PROFILE_URL;
59  }
static final String PROFILE_URL
Definition: GitHubIdentityProvider.java:40

◆ hasExternalExchangeToken()

Response org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.hasExternalExchangeToken ( EventBuilder  event,
UserSessionModel  tokenUserSession,
MultivaluedMap< String, String >  params 
)
inlineprotectedinherited

check to see if we have a token exchange in session in other words check to see if this session was created by an external exchange

引数
tokenUserSession
params
戻り値
195  {
196  if (getConfig().getAlias().equals(tokenUserSession.getNote(OIDCIdentityProvider.EXCHANGE_PROVIDER))) {
197 
198  String requestedType = params.getFirst(OAuth2Constants.REQUESTED_TOKEN_TYPE);
199  if ((requestedType == null || requestedType.equals(OAuth2Constants.ACCESS_TOKEN_TYPE))) {
200  String accessToken = tokenUserSession.getNote(FEDERATED_ACCESS_TOKEN);
201  if (accessToken != null) {
202  AccessTokenResponse tokenResponse = new AccessTokenResponse();
203  tokenResponse.setToken(accessToken);
204  tokenResponse.setIdToken(null);
205  tokenResponse.setRefreshToken(null);
206  tokenResponse.setRefreshExpiresIn(0);
207  tokenResponse.setExpiresIn(0);
208  tokenResponse.getOtherClaims().clear();
209  tokenResponse.getOtherClaims().put(OAuth2Constants.ISSUED_TOKEN_TYPE, OAuth2Constants.ACCESS_TOKEN_TYPE);
210  event.success();
211  return Response.ok(tokenResponse).type(MediaType.APPLICATION_JSON_TYPE).build();
212  }
213  } else if (OAuth2Constants.ID_TOKEN_TYPE.equals(requestedType)) {
214  String idToken = tokenUserSession.getNote(OIDCIdentityProvider.FEDERATED_ID_TOKEN);
215  if (idToken != null) {
216  AccessTokenResponse tokenResponse = new AccessTokenResponse();
217  tokenResponse.setToken(null);
218  tokenResponse.setIdToken(idToken);
219  tokenResponse.setRefreshToken(null);
220  tokenResponse.setRefreshExpiresIn(0);
221  tokenResponse.setExpiresIn(0);
222  tokenResponse.getOtherClaims().clear();
223  tokenResponse.getOtherClaims().put(OAuth2Constants.ISSUED_TOKEN_TYPE, OAuth2Constants.ID_TOKEN_TYPE);
224  event.success();
225  return Response.ok(tokenResponse).type(MediaType.APPLICATION_JSON_TYPE).build();
226  }
227 
228  }
229 
230  }
231  return null;
232  }
C getConfig()
Definition: AbstractOAuth2IdentityProvider.java:126
String FEDERATED_ACCESS_TOKEN
Definition: IdentityProvider.java:38

◆ importNewUser() [1/2]

void org.keycloak.broker.provider.IdentityProvider< C extends IdentityProviderModel >.importNewUser ( KeycloakSession  session,
RealmModel  realm,
UserModel  user,
BrokeredIdentityContext  context 
)
inherited

◆ importNewUser() [2/2]

void org.keycloak.broker.provider.AbstractIdentityProvider< C extends IdentityProviderModel >.importNewUser ( KeycloakSession  session,
RealmModel  realm,
UserModel  user,
BrokeredIdentityContext  context 
)
inlineinherited
157  {
158 
159  }

◆ isIssuer()

boolean org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.isIssuer ( String  issuer,
MultivaluedMap< String, String >  params 
)
inlineinherited

org.keycloak.broker.provider.ExchangeExternalTokenを実装しています。

511  {
512  if (!supportsExternalExchange()) return false;
513  String requestedIssuer = params.getFirst(OAuth2Constants.SUBJECT_ISSUER);
514  if (requestedIssuer == null) requestedIssuer = issuer;
515  return requestedIssuer.equals(getConfig().getAlias());
516  }
C getConfig()
Definition: AbstractOAuth2IdentityProvider.java:126
boolean supportsExternalExchange()
Definition: AbstractOAuth2IdentityProvider.java:506

◆ keycloakInitiatedBrowserLogout() [1/2]

Response org.keycloak.broker.provider.AbstractIdentityProvider< C extends IdentityProviderModel >.keycloakInitiatedBrowserLogout ( KeycloakSession  session,
UserSessionModel  userSession,
UriInfo  uriInfo,
RealmModel  realm 
)
inlineinherited
80  {
81  return null;
82  }

◆ keycloakInitiatedBrowserLogout() [2/2]

Response org.keycloak.broker.provider.IdentityProvider< C extends IdentityProviderModel >.keycloakInitiatedBrowserLogout ( KeycloakSession  session,
UserSessionModel  userSession,
UriInfo  uriInfo,
RealmModel  realm 
)
inherited

Called when a Keycloak application initiates a logout through the browser. This is expected to do a logout with the IDP

引数
userSession
uriInfo
realm
戻り値
null if this is not supported by this provider

◆ performLogin() [1/2]

Response org.keycloak.broker.provider.IdentityProvider< C extends IdentityProviderModel >.performLogin ( AuthenticationRequest  request)
inherited

Initiates the authentication process by sending an authentication request to an identity provider. This method is called only once during the authentication.

引数
requestThe initial authentication request. Contains all the contextual information in order to build an authentication request to the identity provider.
戻り値

org.keycloak.social.twitter.TwitterIdentityProviderで実装されています。

◆ performLogin() [2/2]

110  {
111  try {
112  URI authorizationUrl = createAuthorizationUrl(request).build();
113 
114  return Response.seeOther(authorizationUrl).build();
115  } catch (Exception e) {
116  throw new IdentityBrokerException("Could not create authentication request.", e);
117  }
118  }
UriBuilder createAuthorizationUrl(AuthenticationRequest request)
Definition: AbstractOAuth2IdentityProvider.java:303

◆ preprocessFederatedIdentity() [1/2]

void org.keycloak.broker.provider.IdentityProvider< C extends IdentityProviderModel >.preprocessFederatedIdentity ( KeycloakSession  session,
RealmModel  realm,
BrokeredIdentityContext  context 
)
inherited

◆ preprocessFederatedIdentity() [2/2]

void org.keycloak.broker.provider.AbstractIdentityProvider< C extends IdentityProviderModel >.preprocessFederatedIdentity ( KeycloakSession  session,
RealmModel  realm,
BrokeredIdentityContext  context 
)
inlineinherited
152  {
153 
154  }

◆ retrieveToken() [1/2]

Response org.keycloak.broker.provider.IdentityProvider< C extends IdentityProviderModel >.retrieveToken ( KeycloakSession  session,
FederatedIdentityModel  identity 
)
inherited

Returns a javax.ws.rs.core.Response containing the token previously stored during the authentication process for a specific user.

引数
identity
戻り値

org.keycloak.social.twitter.TwitterIdentityProviderで実装されています。

◆ retrieveToken() [2/2]

Response org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.retrieveToken ( KeycloakSession  session,
FederatedIdentityModel  identity 
)
inlineinherited
121  {
122  return Response.ok(identity.getToken()).build();
123  }

◆ searchEmail()

String org.keycloak.social.github.GitHubIdentityProvider.searchEmail ( String  accessToken)
inlineprivate
96  {
97  try {
98  ArrayNode emails = (ArrayNode) SimpleHttp.doGet(EMAIL_URL, session).header("Authorization", "Bearer " + accessToken).asJson();
99 
100  Iterator<JsonNode> loop = emails.elements();
101  while (loop.hasNext()) {
102  JsonNode mail = loop.next();
103  if (mail.get("primary").asBoolean()) {
104  return getJsonProperty(mail, "email");
105  }
106  }
107  } catch (Exception e) {
108  throw new IdentityBrokerException("Could not obtain user email from github.", e);
109  }
110  throw new IdentityBrokerException("Primary email from github is not found.");
111  }
String getJsonProperty(JsonNode jsonNode, String name)
Definition: AbstractOAuth2IdentityProvider.java:358
static final String EMAIL_URL
Definition: GitHubIdentityProvider.java:41
final KeycloakSession session
Definition: AbstractIdentityProvider.java:47

◆ supportsExternalExchange()

boolean org.keycloak.social.github.GitHubIdentityProvider.supportsExternalExchange ( )
inlineprotected
52  {
53  return true;
54  }

◆ updateBrokeredUser() [1/2]

void org.keycloak.broker.provider.IdentityProvider< C extends IdentityProviderModel >.updateBrokeredUser ( KeycloakSession  session,
RealmModel  realm,
UserModel  user,
BrokeredIdentityContext  context 
)
inherited

◆ updateBrokeredUser() [2/2]

void org.keycloak.broker.provider.AbstractIdentityProvider< C extends IdentityProviderModel >.updateBrokeredUser ( KeycloakSession  session,
RealmModel  realm,
UserModel  user,
BrokeredIdentityContext  context 
)
inlineinherited
162  {
163 
164  }

◆ validateExternalTokenThroughUserInfo()

BrokeredIdentityContext org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.validateExternalTokenThroughUserInfo ( EventBuilder  event,
String  subjectToken,
String  subjectTokenType 
)
inlineprotectedinherited
466  {
467  event.detail("validation_method", "user info");
468  SimpleHttp.Response response = null;
469  int status = 0;
470  try {
471  String userInfoUrl = getProfileEndpointForValidation(event);
472  response = buildUserInfoRequest(subjectToken, userInfoUrl).asResponse();
473  status = response.getStatus();
474  } catch (IOException e) {
475  logger.debug("Failed to invoke user info for external exchange", e);
476  }
477  if (status != 200) {
478  logger.debug("Failed to invoke user info status: " + status);
479  event.detail(Details.REASON, "user info call failure");
480  event.error(Errors.INVALID_TOKEN);
481  throw new ErrorResponseException(OAuthErrorException.INVALID_TOKEN, "invalid token", Response.Status.BAD_REQUEST);
482  }
483  JsonNode profile = null;
484  try {
485  profile = response.asJson();
486  } catch (IOException e) {
487  event.detail(Details.REASON, "user info call failure");
488  event.error(Errors.INVALID_TOKEN);
489  throw new ErrorResponseException(OAuthErrorException.INVALID_TOKEN, "invalid token", Response.Status.BAD_REQUEST);
490  }
491  BrokeredIdentityContext context = extractIdentityFromProfile(event, profile);
492  if (context.getId() == null) {
493  event.detail(Details.REASON, "user info call failure");
494  event.error(Errors.INVALID_TOKEN);
495  throw new ErrorResponseException(OAuthErrorException.INVALID_TOKEN, "invalid token", Response.Status.BAD_REQUEST);
496  }
497  return context;
498  }
BrokeredIdentityContext extractIdentityFromProfile(EventBuilder event, JsonNode node)
Definition: AbstractOAuth2IdentityProvider.java:462
static final Logger logger
Definition: AbstractOAuth2IdentityProvider.java:75
SimpleHttp buildUserInfoRequest(String subjectToken, String userInfoUrl)
Definition: AbstractOAuth2IdentityProvider.java:500
Response asResponse()
Definition: SimpleHttp.java:162
int getStatus()
Definition: SimpleHttp.java:283
String getProfileEndpointForValidation(EventBuilder event)
Definition: AbstractOAuth2IdentityProvider.java:456

メンバ詳解

◆ ACCESS_DENIED

final String org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.ACCESS_DENIED = "access_denied"
staticinherited

◆ ACCOUNT_LINK_URL

final String org.keycloak.broker.provider.AbstractIdentityProvider< C extends IdentityProviderModel >.ACCOUNT_LINK_URL = "account-link-url"
staticinherited

◆ AUTH_URL

final String org.keycloak.social.github.GitHubIdentityProvider.AUTH_URL = "https://github.com/login/oauth/authorize"
static

◆ DEFAULT_SCOPE

final String org.keycloak.social.github.GitHubIdentityProvider.DEFAULT_SCOPE = "user:email"
static

◆ EMAIL_URL

final String org.keycloak.social.github.GitHubIdentityProvider.EMAIL_URL = "https://api.github.com/user/emails"
static

◆ EXTERNAL_IDENTITY_PROVIDER [1/2]

String org.keycloak.broker.provider.IdentityProvider< C extends IdentityProviderModel >.EXTERNAL_IDENTITY_PROVIDER
inherited

◆ EXTERNAL_IDENTITY_PROVIDER [2/2]

String org.keycloak.broker.provider.IdentityProvider< C extends IdentityProviderModel >.EXTERNAL_IDENTITY_PROVIDER = "EXTERNAL_IDENTITY_PROVIDER"
inherited

◆ FEDERATED_ACCESS_TOKEN [1/2]

String org.keycloak.broker.provider.IdentityProvider< C extends IdentityProviderModel >.FEDERATED_ACCESS_TOKEN = "FEDERATED_ACCESS_TOKEN"
inherited

◆ FEDERATED_ACCESS_TOKEN [2/2]

String org.keycloak.broker.provider.IdentityProvider< C extends IdentityProviderModel >.FEDERATED_ACCESS_TOKEN
inherited

◆ FEDERATED_REFRESH_TOKEN

final String org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.FEDERATED_REFRESH_TOKEN = "FEDERATED_REFRESH_TOKEN"
staticinherited

◆ FEDERATED_TOKEN_EXPIRATION

final String org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.FEDERATED_TOKEN_EXPIRATION = "FEDERATED_TOKEN_EXPIRATION"
staticinherited

◆ logger

final Logger org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.logger = Logger.getLogger(AbstractOAuth2IdentityProvider.class)
staticprotectedinherited

◆ mapper

ObjectMapper org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.mapper = new ObjectMapper()
staticprotectedinherited

◆ OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE

final String org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE = "authorization_code"
staticinherited

◆ OAUTH2_GRANT_TYPE_REFRESH_TOKEN

final String org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.OAUTH2_GRANT_TYPE_REFRESH_TOKEN = "refresh_token"
staticinherited

◆ OAUTH2_PARAMETER_ACCESS_TOKEN

final String org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.OAUTH2_PARAMETER_ACCESS_TOKEN = "access_token"
staticinherited

◆ OAUTH2_PARAMETER_CLIENT_ID

final String org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.OAUTH2_PARAMETER_CLIENT_ID = "client_id"
staticinherited

◆ OAUTH2_PARAMETER_CLIENT_SECRET

final String org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.OAUTH2_PARAMETER_CLIENT_SECRET = "client_secret"
staticinherited

◆ OAUTH2_PARAMETER_CODE

final String org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.OAUTH2_PARAMETER_CODE = "code"
staticinherited

◆ OAUTH2_PARAMETER_GRANT_TYPE

final String org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.OAUTH2_PARAMETER_GRANT_TYPE = "grant_type"
staticinherited

◆ OAUTH2_PARAMETER_REDIRECT_URI

final String org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.OAUTH2_PARAMETER_REDIRECT_URI = "redirect_uri"
staticinherited

◆ OAUTH2_PARAMETER_RESPONSE_TYPE

final String org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.OAUTH2_PARAMETER_RESPONSE_TYPE = "response_type"
staticinherited

◆ OAUTH2_PARAMETER_SCOPE

final String org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.OAUTH2_PARAMETER_SCOPE = "scope"
staticinherited

◆ OAUTH2_PARAMETER_STATE

final String org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider< C extends OAuth2IdentityProviderConfig >.OAUTH2_PARAMETER_STATE = "state"
staticinherited

◆ PROFILE_URL

final String org.keycloak.social.github.GitHubIdentityProvider.PROFILE_URL = "https://api.github.com/user"
static

◆ session

◆ TOKEN_URL

final String org.keycloak.social.github.GitHubIdentityProvider.TOKEN_URL = "https://github.com/login/oauth/access_token"
static

このクラス詳解は次のファイルから抽出されました: