gluu
公開メンバ関数 | 非公開メンバ関数 | 非公開変数類 | 全メンバ一覧
org.xdi.oxauth.ws.rs.fido.u2f.U2fRegistrationWS クラス
org.xdi.oxauth.ws.rs.fido.u2f.U2fRegistrationWS 連携図
Collaboration graph

公開メンバ関数

Response startRegistration (@QueryParam("username") String userName, @QueryParam("application") String appId, @QueryParam("session_id") String sessionId, @QueryParam("enrollment_code") String enrollmentCode)
 
Response finishRegistration (@FormParam("username") String userName, @FormParam("tokenResponse") String registerResponseString)
 

非公開メンバ関数

boolean isCurrentAuthenticationLevelCorrespondsToU2fLevel (String session)
 

非公開変数類

Logger log
 
AppConfiguration appConfiguration
 
UserService userService
 
ErrorResponseFactory errorResponseFactory
 
RegistrationService u2fRegistrationService
 
DeviceRegistrationService deviceRegistrationService
 
SessionIdService sessionIdService
 
UserSessionIdService userSessionIdService
 
ValidationService u2fValidationService
 
ExternalAuthenticationService service
 

詳解

The endpoint allows to start and finish U2F registration process

著者
Yuriy Movchan
バージョン
August 9, 2017

関数詳解

◆ finishRegistration()

Response org.xdi.oxauth.ws.rs.fido.u2f.U2fRegistrationWS.finishRegistration ( @FormParam("username") String  userName,
@FormParam("tokenResponse") String  registerResponseString 
)
inline
174  {
175  String sessionId = null;
176  try {
178  return Response.status(Status.FORBIDDEN).build();
179  }
180 
181  log.debug("Finishing registration for username '{}' with response '{}'", userName, registerResponseString);
182 
183  RegisterResponse registerResponse = ServerUtil.jsonMapperWithWrapRoot().readValue(registerResponseString, RegisterResponse.class);
184 
185  String requestId = registerResponse.getRequestId();
186  RegisterRequestMessageLdap registerRequestMessageLdap = u2fRegistrationService.getRegisterRequestMessageByRequestId(requestId);
187  if (registerRequestMessageLdap == null) {
188  throw new WebApplicationException(Response.status(Response.Status.FORBIDDEN)
189  .entity(errorResponseFactory.getJsonErrorResponse(U2fErrorResponseType.SESSION_EXPIRED)).build());
190  }
191  u2fRegistrationService.removeRegisterRequestMessage(registerRequestMessageLdap);
192 
193  String foundUserInum = registerRequestMessageLdap.getUserInum();
194 
195  RegisterRequestMessage registerRequestMessage = registerRequestMessageLdap.getRegisterRequestMessage();
196  DeviceRegistrationResult deviceRegistrationResult = u2fRegistrationService.finishRegistration(registerRequestMessage, registerResponse, foundUserInum);
197 
198  // If sessionId is not empty update session
199  sessionId = registerRequestMessageLdap.getSessionId();
200  if (StringHelper.isNotEmpty(sessionId)) {
201  log.debug("There is session id. Setting session id attributes");
202 
203  boolean oneStep = StringHelper.isEmpty(foundUserInum);
204  userSessionIdService.updateUserSessionIdOnFinishRequest(sessionId, foundUserInum, deviceRegistrationResult, true, oneStep);
205  }
206 
207  RegisterStatus registerStatus = new RegisterStatus(Constants.RESULT_SUCCESS, requestId);
208 
209  // Convert manually to avoid possible conflict between resteasy providers, e.g. jettison, jackson
210  final String entity = ServerUtil.asJson(registerStatus);
211 
212  return Response.status(Response.Status.OK).entity(entity).cacheControl(ServerUtil.cacheControl(true)).build();
213  } catch (Exception ex) {
214  log.error("Exception happened", ex);
215 
216  try {
217  // If sessionId is not empty update session
218  if (StringHelper.isNotEmpty(sessionId)) {
219  log.debug("There is session id. Setting session id status to 'declined'");
221  }
222  } catch (Exception ex2) {
223  log.error("Failed to update session id status", ex2);
224  }
225 
226  if (ex instanceof WebApplicationException) {
227  throw (WebApplicationException) ex;
228  }
229 
230  if (ex instanceof BadInputException) {
231  throw new WebApplicationException(Response.status(Response.Status.FORBIDDEN)
232  .entity(errorResponseFactory.getErrorResponse(U2fErrorResponseType.INVALID_REQUEST)).build());
233  }
234 
235  throw new WebApplicationException(Response.status(Response.Status.INTERNAL_SERVER_ERROR)
236  .entity(errorResponseFactory.getJsonErrorResponse(U2fErrorResponseType.SERVER_ERROR)).build());
237  }
238  }
Boolean getDisableU2fEndpoint()
Definition: AppConfiguration.java:1401
void updateUserSessionIdOnError(String sessionId)
Definition: UserSessionIdService.java:59
ErrorResponseFactory errorResponseFactory
Definition: U2fRegistrationWS.java:76
DefaultErrorResponse getErrorResponse(IErrorType type, String p_state)
Definition: ErrorResponseFactory.java:130
void removeRegisterRequestMessage(RequestMessageLdap registerRequestMessageLdap)
Definition: RegistrationService.java:222
DeviceRegistrationResult finishRegistration(RegisterRequestMessage requestMessage, RegisterResponse response, String userInum)
Definition: RegistrationService.java:124
RegistrationService u2fRegistrationService
Definition: U2fRegistrationWS.java:79
String getJsonErrorResponse(IErrorType type)
Definition: ErrorResponseFactory.java:210
UserSessionIdService userSessionIdService
Definition: U2fRegistrationWS.java:88
AppConfiguration appConfiguration
Definition: U2fRegistrationWS.java:70
void updateUserSessionIdOnFinishRequest(String sessionId, String userInum, DeviceRegistrationResult deviceRegistrationResult, boolean enroll, boolean oneStep)
Definition: UserSessionIdService.java:39
RegisterRequestMessageLdap getRegisterRequestMessageByRequestId(String requestId)
Definition: RegistrationService.java:209
Logger log
Definition: U2fRegistrationWS.java:67

◆ isCurrentAuthenticationLevelCorrespondsToU2fLevel()

boolean org.xdi.oxauth.ws.rs.fido.u2f.U2fRegistrationWS.isCurrentAuthenticationLevelCorrespondsToU2fLevel ( String  session)
inlineprivate
240  {
241  SessionId sessionId = sessionIdService.getSessionId(session);
242  if (sessionId == null)
243  return false;
244 
245  String acrValuesStr = sessionIdService.getAcr(sessionId);
246  if (acrValuesStr == null)
247  return false;
248 
249  CustomScriptConfiguration u2fScriptConfiguration = service.getCustomScriptConfigurationByName("u2f");
250  if (u2fScriptConfiguration == null)
251  return false;
252 
253  String[] acrValuesArray = acrValuesStr.split(" ");
254  for (String acrValue : acrValuesArray) {
255  CustomScriptConfiguration currentScriptConfiguration = service.getCustomScriptConfigurationByName(acrValue);
256  if (currentScriptConfiguration == null)
257  continue;
258 
259  if (currentScriptConfiguration.getLevel() >= u2fScriptConfiguration.getLevel())
260  return true;
261  }
262 
263  return false;
264  }
SessionId getSessionId()
Definition: SessionIdService.java:360
CustomScriptConfiguration getCustomScriptConfigurationByName(String name)
Definition: ExternalAuthenticationService.java:400
String getAcr(SessionId session)
Definition: SessionIdService.java:109
ExternalAuthenticationService service
Definition: U2fRegistrationWS.java:94
SessionIdService sessionIdService
Definition: U2fRegistrationWS.java:85

◆ startRegistration()

Response org.xdi.oxauth.ws.rs.fido.u2f.U2fRegistrationWS.startRegistration ( @QueryParam("username") String  userName,
@QueryParam("application") String  appId,
@QueryParam("session_id") String  sessionId,
@QueryParam("enrollment_code") String  enrollmentCode 
)
inline
98  {
99  // Parameter username is deprecated. We uses it only to determine is it's one or two step workflow
100  try {
102  return Response.status(Status.FORBIDDEN).build();
103  }
104 
105  log.debug("Startig registration with username '{}' for appId '{}'. session_id '{}', enrollment_code '{}'", userName, appId, sessionId, enrollmentCode);
106 
107  String userInum = null;
108 
109  boolean sessionBasedEnrollment = false;
110  boolean twoStep = StringHelper.isNotEmpty(userName);
111  if (twoStep) {
112  boolean removeEnrollment = false;
113  if (StringHelper.isNotEmpty(sessionId)) {
114  boolean valid = u2fValidationService.isValidSessionId(userName, sessionId);
115  if (!valid) {
116  throw new BadInputException(String.format("session_id '%s' is invalid", sessionId));
117  }
118  sessionBasedEnrollment = true;
119  } else if (StringHelper.isNotEmpty(enrollmentCode)) {
120  boolean valid = u2fValidationService.isValidEnrollmentCode(userName, enrollmentCode);
121  if (!valid) {
122  throw new BadInputException(String.format("enrollment_code '%s' is invalid", enrollmentCode));
123  }
124  removeEnrollment = true;
125  } else {
126  throw new BadInputException("session_id or enrollment_code is mandatory");
127  }
128 
129  User user = userService.getUser(userName);
130  userInum = userService.getUserInum(user);
131  if (StringHelper.isEmpty(userInum)) {
132  throw new BadInputException(String.format("Failed to find user '%s' in LDAP", userName));
133  }
134 
135  if (removeEnrollment) {
136  // We allow to use enrollment code only one time
137  user.setAttribute(U2fConstants.U2F_ENROLLMENT_CODE_ATTRIBUTE, (String) null);
138  userService.updateUser(user);
139  }
140  }
141 
142  if (sessionBasedEnrollment) {
143  List<DeviceRegistration> deviceRegistrations = deviceRegistrationService.findUserDeviceRegistrations(userInum, appId);
144  if (deviceRegistrations.size() > 0 && !isCurrentAuthenticationLevelCorrespondsToU2fLevel(sessionId)) {
145  throw new RegistrationNotAllowed(String.format("It's not possible to start registration with user_name and session_id because user '%s' has already enrolled device", userName));
146  }
147  }
148 
149  RegisterRequestMessage registerRequestMessage = u2fRegistrationService.builRegisterRequestMessage(appId, userInum);
150  u2fRegistrationService.storeRegisterRequestMessage(registerRequestMessage, userInum, sessionId);
151 
152  // Convert manually to avoid possible conflict between resteasy providers, e.g. jettison, jackson
153  final String entity = ServerUtil.asJson(registerRequestMessage);
154 
155  return Response.status(Response.Status.OK).entity(entity).cacheControl(ServerUtil.cacheControl(true)).build();
156  } catch (Exception ex) {
157  log.error("Exception happened", ex);
158  if (ex instanceof WebApplicationException) {
159  throw (WebApplicationException) ex;
160  }
161 
162  if (ex instanceof RegistrationNotAllowed) {
163  throw new WebApplicationException(Response.status(Response.Status.NOT_ACCEPTABLE)
164  .entity(errorResponseFactory.getErrorResponse(U2fErrorResponseType.REGISTRATION_NOT_ALLOWED)).build());
165  }
166 
167  throw new WebApplicationException(Response.status(Response.Status.INTERNAL_SERVER_ERROR)
168  .entity(errorResponseFactory.getJsonErrorResponse(U2fErrorResponseType.SERVER_ERROR)).build());
169  }
170  }
void storeRegisterRequestMessage(RegisterRequestMessage requestMessage, String userInum, String sessionId)
Definition: RegistrationService.java:188
Boolean getDisableU2fEndpoint()
Definition: AppConfiguration.java:1401
RegisterRequestMessage builRegisterRequestMessage(String appId, String userInum)
Definition: RegistrationService.java:86
ErrorResponseFactory errorResponseFactory
Definition: U2fRegistrationWS.java:76
DefaultErrorResponse getErrorResponse(IErrorType type, String p_state)
Definition: ErrorResponseFactory.java:130
boolean isCurrentAuthenticationLevelCorrespondsToU2fLevel(String session)
Definition: U2fRegistrationWS.java:240
boolean isValidEnrollmentCode(String userName, String enrollmentCode)
Definition: ValidationService.java:62
List< DeviceRegistration > findUserDeviceRegistrations(String userInum, String appId, String ... returnAttributes)
Definition: DeviceRegistrationService.java:78
User getUser(String userId, String... returnAttributes)
Definition: UserService.java:87
UserService userService
Definition: U2fRegistrationWS.java:73
RegistrationService u2fRegistrationService
Definition: U2fRegistrationWS.java:79
String getJsonErrorResponse(IErrorType type)
Definition: ErrorResponseFactory.java:210
ValidationService u2fValidationService
Definition: U2fRegistrationWS.java:91
User updateUser(User user)
Definition: UserService.java:136
AppConfiguration appConfiguration
Definition: U2fRegistrationWS.java:70
String getUserInum(User user)
Definition: UserService.java:106
boolean isValidSessionId(String userName, String sessionId)
Definition: ValidationService.java:41
DeviceRegistrationService deviceRegistrationService
Definition: U2fRegistrationWS.java:82
Logger log
Definition: U2fRegistrationWS.java:67

メンバ詳解

◆ appConfiguration

AppConfiguration org.xdi.oxauth.ws.rs.fido.u2f.U2fRegistrationWS.appConfiguration
private

◆ deviceRegistrationService

DeviceRegistrationService org.xdi.oxauth.ws.rs.fido.u2f.U2fRegistrationWS.deviceRegistrationService
private

◆ errorResponseFactory

ErrorResponseFactory org.xdi.oxauth.ws.rs.fido.u2f.U2fRegistrationWS.errorResponseFactory
private

◆ log

Logger org.xdi.oxauth.ws.rs.fido.u2f.U2fRegistrationWS.log
private

◆ service

ExternalAuthenticationService org.xdi.oxauth.ws.rs.fido.u2f.U2fRegistrationWS.service
private

◆ sessionIdService

SessionIdService org.xdi.oxauth.ws.rs.fido.u2f.U2fRegistrationWS.sessionIdService
private

◆ u2fRegistrationService

RegistrationService org.xdi.oxauth.ws.rs.fido.u2f.U2fRegistrationWS.u2fRegistrationService
private

◆ u2fValidationService

ValidationService org.xdi.oxauth.ws.rs.fido.u2f.U2fRegistrationWS.u2fValidationService
private

◆ userService

UserService org.xdi.oxauth.ws.rs.fido.u2f.U2fRegistrationWS.userService
private

◆ userSessionIdService

UserSessionIdService org.xdi.oxauth.ws.rs.fido.u2f.U2fRegistrationWS.userSessionIdService
private

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