keycloak-service
静的公開メンバ関数 | 静的非公開メンバ関数 | 静的非公開変数類 | 全メンバ一覧
org.keycloak.protocol.oidc.utils.RedirectUtils クラス
org.keycloak.protocol.oidc.utils.RedirectUtils 連携図
Collaboration graph

静的公開メンバ関数

static String verifyRealmRedirectUri (UriInfo uriInfo, String redirectUri, RealmModel realm)
 
static String verifyRedirectUri (UriInfo uriInfo, String redirectUri, RealmModel realm, ClientModel client)
 
static String verifyRedirectUri (UriInfo uriInfo, String redirectUri, RealmModel realm, ClientModel client, boolean requireRedirectUri)
 
static Set< String > resolveValidRedirects (UriInfo uriInfo, String rootUrl, Set< String > validRedirects)
 

静的非公開メンバ関数

static Set< String > getValidateRedirectUris (UriInfo uriInfo, RealmModel realm)
 
static String verifyRedirectUri (UriInfo uriInfo, String rootUrl, String redirectUri, RealmModel realm, Set< String > validRedirects, boolean requireRedirectUri)
 
static String lowerCaseHostname (String redirectUri)
 
static String relativeToAbsoluteURI (UriInfo uriInfo, String rootUrl, String relative)
 
static boolean matchesRedirects (Set< String > validRedirects, String redirect)
 
static String getSingleValidRedirectUri (Collection< String > validRedirects)
 

静的非公開変数類

static final Logger logger = Logger.getLogger(RedirectUtils.class)
 

詳解

著者
Stian Thorgersen

関数詳解

◆ getSingleValidRedirectUri()

static String org.keycloak.protocol.oidc.utils.RedirectUtils.getSingleValidRedirectUri ( Collection< String >  validRedirects)
inlinestaticprivate
163  {
164  if (validRedirects.size() != 1) return null;
165  String validRedirect = validRedirects.iterator().next();
166  int idx = validRedirect.indexOf("/*");
167  if (idx > -1) {
168  validRedirect = validRedirect.substring(0, idx);
169  }
170  return validRedirect;
171  }

◆ getValidateRedirectUris()

static Set<String> org.keycloak.protocol.oidc.utils.RedirectUtils.getValidateRedirectUris ( UriInfo  uriInfo,
RealmModel  realm 
)
inlinestaticprivate
69  {
70  Set<String> redirects = new HashSet<>();
71  for (ClientModel client : realm.getClients()) {
72  redirects.addAll(resolveValidRedirects(uriInfo, client.getRootUrl(), client.getRedirectUris()));
73  }
74  return redirects;
75  }
static Set< String > resolveValidRedirects(UriInfo uriInfo, String rootUrl, Set< String > validRedirects)
Definition: RedirectUtils.java:55

◆ lowerCaseHostname()

static String org.keycloak.protocol.oidc.utils.RedirectUtils.lowerCaseHostname ( String  redirectUri)
inlinestaticprivate
126  {
127  int n = redirectUri.indexOf('/', 7);
128  if (n == -1) {
129  return redirectUri.toLowerCase();
130  } else {
131  return redirectUri.substring(0, n).toLowerCase() + redirectUri.substring(n);
132  }
133  }

◆ matchesRedirects()

static boolean org.keycloak.protocol.oidc.utils.RedirectUtils.matchesRedirects ( Set< String >  validRedirects,
String  redirect 
)
inlinestaticprivate
145  {
146  for (String validRedirect : validRedirects) {
147  if (validRedirect.endsWith("*") && !validRedirect.contains("?")) {
148  // strip off the query component - we don't check them when wildcards are effective
149  String r = redirect.contains("?") ? redirect.substring(0, redirect.indexOf("?")) : redirect;
150  // strip off *
151  int length = validRedirect.length() - 1;
152  validRedirect = validRedirect.substring(0, length);
153  if (r.startsWith(validRedirect)) return true;
154  // strip off trailing '/'
155  if (length - 1 > 0 && validRedirect.charAt(length - 1) == '/') length--;
156  validRedirect = validRedirect.substring(0, length);
157  if (validRedirect.equals(r)) return true;
158  } else if (validRedirect.equals(redirect)) return true;
159  }
160  return false;
161  }

◆ relativeToAbsoluteURI()

static String org.keycloak.protocol.oidc.utils.RedirectUtils.relativeToAbsoluteURI ( UriInfo  uriInfo,
String  rootUrl,
String  relative 
)
inlinestaticprivate
135  {
136  if (rootUrl == null || rootUrl.isEmpty()) {
137  rootUrl = UriUtils.getOrigin(uriInfo.getBaseUri());
138  }
139  StringBuilder sb = new StringBuilder();
140  sb.append(rootUrl);
141  sb.append(relative);
142  return sb.toString();
143  }

◆ resolveValidRedirects()

static Set<String> org.keycloak.protocol.oidc.utils.RedirectUtils.resolveValidRedirects ( UriInfo  uriInfo,
String  rootUrl,
Set< String >  validRedirects 
)
inlinestatic
55  {
56  // If the valid redirect URI is relative (no scheme, host, port) then use the request's scheme, host, and port
57  Set<String> resolveValidRedirects = new HashSet<String>();
58  for (String validRedirect : validRedirects) {
59  resolveValidRedirects.add(validRedirect); // add even relative urls.
60  if (validRedirect.startsWith("/")) {
61  validRedirect = relativeToAbsoluteURI(uriInfo, rootUrl, validRedirect);
62  logger.debugv("replacing relative valid redirect with: {0}", validRedirect);
63  resolveValidRedirects.add(validRedirect);
64  }
65  }
66  return resolveValidRedirects;
67  }
static final Logger logger
Definition: RedirectUtils.java:38
static String relativeToAbsoluteURI(UriInfo uriInfo, String rootUrl, String relative)
Definition: RedirectUtils.java:135
static Set< String > resolveValidRedirects(UriInfo uriInfo, String rootUrl, Set< String > validRedirects)
Definition: RedirectUtils.java:55

◆ verifyRealmRedirectUri()

static String org.keycloak.protocol.oidc.utils.RedirectUtils.verifyRealmRedirectUri ( UriInfo  uriInfo,
String  redirectUri,
RealmModel  realm 
)
inlinestatic
40  {
41  Set<String> validRedirects = getValidateRedirectUris(uriInfo, realm);
42  return verifyRedirectUri(uriInfo, null, redirectUri, realm, validRedirects, true);
43  }
static String verifyRedirectUri(UriInfo uriInfo, String redirectUri, RealmModel realm, ClientModel client)
Definition: RedirectUtils.java:45
static Set< String > getValidateRedirectUris(UriInfo uriInfo, RealmModel realm)
Definition: RedirectUtils.java:69

◆ verifyRedirectUri() [1/3]

static String org.keycloak.protocol.oidc.utils.RedirectUtils.verifyRedirectUri ( UriInfo  uriInfo,
String  redirectUri,
RealmModel  realm,
ClientModel  client 
)
inlinestatic
45  {
46  return verifyRedirectUri(uriInfo, redirectUri, realm, client, true);
47  }
static String verifyRedirectUri(UriInfo uriInfo, String redirectUri, RealmModel realm, ClientModel client)
Definition: RedirectUtils.java:45

◆ verifyRedirectUri() [2/3]

static String org.keycloak.protocol.oidc.utils.RedirectUtils.verifyRedirectUri ( UriInfo  uriInfo,
String  redirectUri,
RealmModel  realm,
ClientModel  client,
boolean  requireRedirectUri 
)
inlinestatic
49  {
50  if (client != null)
51  return verifyRedirectUri(uriInfo, client.getRootUrl(), redirectUri, realm, client.getRedirectUris(), requireRedirectUri);
52  return null;
53  }
static String verifyRedirectUri(UriInfo uriInfo, String redirectUri, RealmModel realm, ClientModel client)
Definition: RedirectUtils.java:45

◆ verifyRedirectUri() [3/3]

static String org.keycloak.protocol.oidc.utils.RedirectUtils.verifyRedirectUri ( UriInfo  uriInfo,
String  rootUrl,
String  redirectUri,
RealmModel  realm,
Set< String >  validRedirects,
boolean  requireRedirectUri 
)
inlinestaticprivate
77  {
78  if (redirectUri == null) {
79  if (!requireRedirectUri) {
80  redirectUri = getSingleValidRedirectUri(validRedirects);
81  }
82 
83  if (redirectUri == null) {
84  logger.debug("No Redirect URI parameter specified");
85  return null;
86  }
87  } else if (validRedirects.isEmpty()) {
88  logger.debug("No Redirect URIs supplied");
89  redirectUri = null;
90  } else {
91  redirectUri = lowerCaseHostname(redirectUri);
92 
93  String r = redirectUri;
94  Set<String> resolveValidRedirects = resolveValidRedirects(uriInfo, rootUrl, validRedirects);
95 
96  boolean valid = matchesRedirects(resolveValidRedirects, r);
97 
98  if (!valid && r.startsWith(Constants.INSTALLED_APP_URL) && r.indexOf(':', Constants.INSTALLED_APP_URL.length()) >= 0) {
99  int i = r.indexOf(':', Constants.INSTALLED_APP_URL.length());
100 
101  StringBuilder sb = new StringBuilder();
102  sb.append(r.substring(0, i));
103 
104  i = r.indexOf('/', i);
105  if (i >= 0) {
106  sb.append(r.substring(i));
107  }
108 
109  r = sb.toString();
110 
111  valid = matchesRedirects(resolveValidRedirects, r);
112  }
113  if (valid && redirectUri.startsWith("/")) {
114  redirectUri = relativeToAbsoluteURI(uriInfo, rootUrl, redirectUri);
115  }
116  redirectUri = valid ? redirectUri : null;
117  }
118 
119  if (Constants.INSTALLED_APP_URN.equals(redirectUri)) {
120  return Urls.realmInstalledAppUrnCallback(uriInfo.getBaseUri(), realm.getName()).toString();
121  } else {
122  return redirectUri;
123  }
124  }
static final Logger logger
Definition: RedirectUtils.java:38
static String getSingleValidRedirectUri(Collection< String > validRedirects)
Definition: RedirectUtils.java:163
static String relativeToAbsoluteURI(UriInfo uriInfo, String rootUrl, String relative)
Definition: RedirectUtils.java:135
static String lowerCaseHostname(String redirectUri)
Definition: RedirectUtils.java:126
static boolean matchesRedirects(Set< String > validRedirects, String redirect)
Definition: RedirectUtils.java:145
static Set< String > resolveValidRedirects(UriInfo uriInfo, String rootUrl, Set< String > validRedirects)
Definition: RedirectUtils.java:55

メンバ詳解

◆ logger

final Logger org.keycloak.protocol.oidc.utils.RedirectUtils.logger = Logger.getLogger(RedirectUtils.class)
staticprivate

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