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

公開メンバ関数

void onCache (RealmModel realm, CachedUserModel user, UserModel delegate)
 
 OTPCredentialProvider (KeycloakSession session)
 
boolean updateCredential (RealmModel realm, UserModel user, CredentialInput input)
 
void disableCredentialType (RealmModel realm, UserModel user, String credentialType)
 
Set< String > getDisableableCredentialTypes (RealmModel realm, UserModel user)
 
boolean supportsCredentialType (String credentialType)
 
boolean isConfiguredFor (RealmModel realm, UserModel user, String credentialType)
 
boolean isValid (RealmModel realm, UserModel user, CredentialInput input)
 

静的公開メンバ関数

static boolean validOTP (RealmModel realm, String token, String secret)
 

限定公開メンバ関数

List< CredentialModel > getCachedCredentials (UserModel user, String type)
 
UserCredentialStore getCredentialStore ()
 
boolean configuredForHOTP (RealmModel realm, UserModel user)
 
boolean configuredForTOTP (RealmModel realm, UserModel user)
 

限定公開変数類

KeycloakSession session
 

静的非公開変数類

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

詳解

著者
Bill Burke
バージョン
Revision
1

構築子と解体子

◆ OTPCredentialProvider()

org.keycloak.credential.OTPCredentialProvider.OTPCredentialProvider ( KeycloakSession  session)
inline
66  {
67  this.session = session;
68  }
KeycloakSession session
Definition: OTPCredentialProvider.java:44

関数詳解

◆ configuredForHOTP()

boolean org.keycloak.credential.OTPCredentialProvider.configuredForHOTP ( RealmModel  realm,
UserModel  user 
)
inlineprotected
192  {
193  return !getCredentialStore().getStoredCredentialsByType(realm, user, CredentialModel.HOTP).isEmpty();
194  }
UserCredentialStore getCredentialStore()
Definition: OTPCredentialProvider.java:55

◆ configuredForTOTP()

boolean org.keycloak.credential.OTPCredentialProvider.configuredForTOTP ( RealmModel  realm,
UserModel  user 
)
inlineprotected
196  {
197  List<CredentialModel> cachedCredentials = getCachedCredentials(user, CredentialModel.TOTP);
198  if (cachedCredentials == null) return !getCredentialStore().getStoredCredentialsByType(realm, user, CredentialModel.TOTP).isEmpty();
199  return !cachedCredentials.isEmpty();
200  }
UserCredentialStore getCredentialStore()
Definition: OTPCredentialProvider.java:55
List< CredentialModel > getCachedCredentials(UserModel user, String type)
Definition: OTPCredentialProvider.java:46

◆ disableCredentialType()

void org.keycloak.credential.OTPCredentialProvider.disableCredentialType ( RealmModel  realm,
UserModel  user,
String  credentialType 
)
inline
117  {
118  boolean disableTOTP = false, disableHOTP = false;
119  if (CredentialModel.OTP.equals(credentialType)) {
120  disableTOTP = true;
121  disableHOTP = true;
122  } else if (CredentialModel.HOTP.equals(credentialType)) {
123  disableHOTP = true;
124 
125  } else if (CredentialModel.TOTP.equals(credentialType)) {
126  disableTOTP = true;
127  }
128  if (disableHOTP) {
129  List<CredentialModel> hotp = getCredentialStore().getStoredCredentialsByType(realm, user, CredentialModel.HOTP);
130  for (CredentialModel cred : hotp) {
131  getCredentialStore().removeStoredCredential(realm, user, cred.getId());
132  }
133 
134  }
135  if (disableTOTP) {
136  List<CredentialModel> totp = getCredentialStore().getStoredCredentialsByType(realm, user, CredentialModel.TOTP);
137  if (!totp.isEmpty()) {
138  for (CredentialModel cred : totp) {
139  getCredentialStore().removeStoredCredential(realm, user, cred.getId());
140  }
141  }
142 
143  }
144  if (disableTOTP || disableHOTP) {
145  UserCache userCache = session.userCache();
146  if (userCache != null) {
147  userCache.evict(realm, user);
148  }
149  }
150  }
UserCredentialStore getCredentialStore()
Definition: OTPCredentialProvider.java:55
KeycloakSession session
Definition: OTPCredentialProvider.java:44

◆ getCachedCredentials()

List<CredentialModel> org.keycloak.credential.OTPCredentialProvider.getCachedCredentials ( UserModel  user,
String  type 
)
inlineprotected
46  {
47  if (!(user instanceof CachedUserModel)) return null;
48  CachedUserModel cached = (CachedUserModel)user;
49  if (cached.isMarkedForEviction()) return null;
50  List<CredentialModel> rtn = (List<CredentialModel>)cached.getCachedWith().get(OTPCredentialProvider.class.getName() + "." + type);
51  if (rtn == null) return Collections.EMPTY_LIST;
52  return rtn;
53  }
OTPCredentialProvider(KeycloakSession session)
Definition: OTPCredentialProvider.java:66

◆ getCredentialStore()

UserCredentialStore org.keycloak.credential.OTPCredentialProvider.getCredentialStore ( )
inlineprotected
55  {
56  return session.userCredentialManager();
57  }
KeycloakSession session
Definition: OTPCredentialProvider.java:44

◆ getDisableableCredentialTypes()

Set<String> org.keycloak.credential.OTPCredentialProvider.getDisableableCredentialTypes ( RealmModel  realm,
UserModel  user 
)
inline
153  {
154  if (!getCredentialStore().getStoredCredentialsByType(realm, user, CredentialModel.HOTP).isEmpty()
155  || !getCredentialStore().getStoredCredentialsByType(realm, user, CredentialModel.TOTP).isEmpty()) {
156  Set<String> set = new HashSet<>();
157  set.add(CredentialModel.OTP);
158  return set;
159  } else {
160  return Collections.EMPTY_SET;
161  }
162  }
UserCredentialStore getCredentialStore()
Definition: OTPCredentialProvider.java:55

◆ isConfiguredFor()

boolean org.keycloak.credential.OTPCredentialProvider.isConfiguredFor ( RealmModel  realm,
UserModel  user,
String  credentialType 
)
inline
173  {
174  if (!supportsCredentialType(credentialType)) return false;
175  if (CredentialModel.OTP.equals(credentialType)) {
176  if (realm.getOTPPolicy().getType().equals(CredentialModel.HOTP)) {
177  return configuredForHOTP(realm, user);
178  } else {
179  return configuredForTOTP(realm, user);
180  }
181  } else if (CredentialModel.HOTP.equals(credentialType)) {
182  return configuredForHOTP(realm, user);
183 
184  } else if (CredentialModel.TOTP.equals(credentialType)) {
185  return configuredForTOTP(realm, user);
186  } else {
187  return false;
188  }
189 
190  }
boolean configuredForHOTP(RealmModel realm, UserModel user)
Definition: OTPCredentialProvider.java:192
boolean supportsCredentialType(String credentialType)
Definition: OTPCredentialProvider.java:166
boolean configuredForTOTP(RealmModel realm, UserModel user)
Definition: OTPCredentialProvider.java:196

◆ isValid()

boolean org.keycloak.credential.OTPCredentialProvider.isValid ( RealmModel  realm,
UserModel  user,
CredentialInput  input 
)
inline
216  {
217  if (! (input instanceof UserCredentialModel)) {
218  logger.debug("Expected instance of UserCredentialModel for CredentialInput");
219  return false;
220 
221  }
222  String token = ((UserCredentialModel)input).getValue();
223  if (token == null) {
224  return false;
225  }
226 
227  OTPPolicy policy = realm.getOTPPolicy();
228  if (realm.getOTPPolicy().getType().equals(CredentialModel.HOTP)) {
229  HmacOTP validator = new HmacOTP(policy.getDigits(), policy.getAlgorithm(), policy.getLookAheadWindow());
230  for (CredentialModel cred : getCredentialStore().getStoredCredentialsByType(realm, user, CredentialModel.HOTP)) {
231  int counter = validator.validateHOTP(token, cred.getValue(), cred.getCounter());
232  if (counter < 0) continue;
233  cred.setCounter(counter);
234  getCredentialStore().updateCredential(realm, user, cred);
235  return true;
236  }
237  } else {
238  TimeBasedOTP validator = new TimeBasedOTP(policy.getAlgorithm(), policy.getDigits(), policy.getPeriod(), policy.getLookAheadWindow());
239  List<CredentialModel> creds = getCachedCredentials(user, CredentialModel.TOTP);
240  if (creds == null) {
241  creds = getCredentialStore().getStoredCredentialsByType(realm, user, CredentialModel.TOTP);
242  } else {
243  logger.debugv("Cache hit for TOTP for user {0}", user.getUsername());
244  }
245  for (CredentialModel cred : creds) {
246  if (validator.validateTOTP(token, cred.getValue().getBytes())) {
247  return true;
248  }
249  }
250 
251  }
252  return false;
253  }
UserCredentialStore getCredentialStore()
Definition: OTPCredentialProvider.java:55
List< CredentialModel > getCachedCredentials(UserModel user, String type)
Definition: OTPCredentialProvider.java:46
static final Logger logger
Definition: OTPCredentialProvider.java:42

◆ onCache()

void org.keycloak.credential.OTPCredentialProvider.onCache ( RealmModel  realm,
CachedUserModel  user,
UserModel  delegate 
)
inline
60  {
61  List<CredentialModel> creds = getCredentialStore().getStoredCredentialsByType(realm, user, CredentialModel.TOTP);
62  user.getCachedWith().put(OTPCredentialProvider.class.getName() + "." + CredentialModel.TOTP, creds);
63 
64  }
OTPCredentialProvider(KeycloakSession session)
Definition: OTPCredentialProvider.java:66
UserCredentialStore getCredentialStore()
Definition: OTPCredentialProvider.java:55

◆ supportsCredentialType()

boolean org.keycloak.credential.OTPCredentialProvider.supportsCredentialType ( String  credentialType)
inline
166  {
167  return CredentialModel.OTP.equals(credentialType)
168  || CredentialModel.HOTP.equals(credentialType)
169  || CredentialModel.TOTP.equals(credentialType);
170  }

◆ updateCredential()

boolean org.keycloak.credential.OTPCredentialProvider.updateCredential ( RealmModel  realm,
UserModel  user,
CredentialInput  input 
)
inline
71  {
72  if (!supportsCredentialType(input.getType())) return false;
73 
74  if (!(input instanceof UserCredentialModel)) {
75  logger.debug("Expected instance of UserCredentialModel for CredentialInput");
76  return false;
77  }
78  UserCredentialModel inputModel = (UserCredentialModel)input;
79  CredentialModel model = null;
80  if (inputModel.getDevice() != null) {
81  model = getCredentialStore().getStoredCredentialByNameAndType(realm, user, inputModel.getDevice(), CredentialModel.TOTP);
82  if (model == null) {
83  model = getCredentialStore().getStoredCredentialByNameAndType(realm, user, inputModel.getDevice(), CredentialModel.HOTP);
84  }
85  }
86  if (model == null) {
87  // delete all existing
88  disableCredentialType(realm, user, CredentialModel.OTP);
89  model = new CredentialModel();
90  }
91 
92  OTPPolicy policy = realm.getOTPPolicy();
93  model.setDigits(policy.getDigits());
94  model.setCounter(policy.getInitialCounter());
95  model.setAlgorithm(policy.getAlgorithm());
96  model.setType(input.getType());
97  model.setValue(inputModel.getValue());
98  model.setDevice(inputModel.getDevice());
99  model.setPeriod(policy.getPeriod());
100  model.setCreatedDate(Time.currentTimeMillis());
101  if (model.getId() == null) {
102  getCredentialStore().createCredential(realm, user, model);
103  } else {
104  getCredentialStore().updateCredential(realm, user, model);
105  }
106  UserCache userCache = session.userCache();
107  if (userCache != null) {
108  userCache.evict(realm, user);
109  }
110  return true;
111 
112 
113 
114  }
boolean supportsCredentialType(String credentialType)
Definition: OTPCredentialProvider.java:166
UserCredentialStore getCredentialStore()
Definition: OTPCredentialProvider.java:55
KeycloakSession session
Definition: OTPCredentialProvider.java:44
static final Logger logger
Definition: OTPCredentialProvider.java:42
void disableCredentialType(RealmModel realm, UserModel user, String credentialType)
Definition: OTPCredentialProvider.java:117

◆ validOTP()

static boolean org.keycloak.credential.OTPCredentialProvider.validOTP ( RealmModel  realm,
String  token,
String  secret 
)
inlinestatic
202  {
203  OTPPolicy policy = realm.getOTPPolicy();
204  if (policy.getType().equals(UserCredentialModel.TOTP)) {
205  TimeBasedOTP validator = new TimeBasedOTP(policy.getAlgorithm(), policy.getDigits(), policy.getPeriod(), policy.getLookAheadWindow());
206  return validator.validateTOTP(token, secret.getBytes());
207  } else {
208  HmacOTP validator = new HmacOTP(policy.getDigits(), policy.getAlgorithm(), policy.getLookAheadWindow());
209  int c = validator.validateHOTP(token, secret, policy.getInitialCounter());
210  return c > -1;
211  }
212 
213  }

メンバ詳解

◆ logger

final Logger org.keycloak.credential.OTPCredentialProvider.logger = Logger.getLogger(OTPCredentialProvider.class)
staticprivate

◆ session

KeycloakSession org.keycloak.credential.OTPCredentialProvider.session
protected

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