Здравствуйте!
Можно реализовать два варианта входа пользователя в приложение по ссылке.
Первый способ это использование параметров URL навигации (документация) в экране LoginWindow
. Простой пример, допустим мы знаем что token “e63cacd4-646b-4232-bd72-36ddff780bbf” сгенерирован только для пользователя admin
. Тогда в расширенном экране LoginWindow
можно написать следующее:
private NavigationState state;
private String secretToken = "e63cacd4-646b-4232-bd72-36ddff780bbf";
@Inject
private UrlRouting urlRouting;
@Subscribe
private void onBeforeShow(BeforeShowEvent event) {
state = urlRouting.getState();
}
@Subscribe
private void onAfterShow(AfterShowEvent event) {
String st = state.getParams().get("st");
if (secretToken.equals(st)) {
doLogin(new ExternalUserCredentials("admin"));
}
}
В onBeforeShow
мы сохраняем текущее состояние URL вместе с параметрами, для того чтобы после показа экрана мы могли проверить token и осуществить вход пользователя в приложение.
Вход можно осуществить по следующей ссылке:
localhost:8080/app/#login?st=e63cacd4-646b-4232-bd72-36ddff780bbf
Полезные ссылки:
Второй пример использует HttpRequestFilter
(см. процесс входа Web Client) и слушатель старта веб сессии (документация).
В фильтре мы смотрим наличие необходимого параметра в запросе, и если он присутствует, сохраняем его в HttpSession.
String st = request.getParameter("st");
if (!Strings.isNullOrEmpty(st)) {
request.getSession().setAttribute("st", st);
RequestContext.create(request, response);
response.sendRedirect(ControllerUtils.getLocationWithoutParams(
URI.create(request.getRequestURL().toString())));
}
chain.doFilter(request, response);
Редирект используется для того, чтобы параметры запроса не отображались при дальнейшей работе.
В обработчике старта веб сессии получаем необходимый параметр и обрабатываем его.
private String secretToken = "e63cacd4-646b-4232-bd72-36ddff780bbf";
@Override
public void onApplicationEvent(AppStartedEvent event) {
App app = event.getApp();
Connection connection = app.getConnection();
if (!connection.isAuthenticated()) {
RequestContext requestContext = RequestContext.get();
if (requestContext != null) {
HttpServletRequest request = requestContext.getRequest();
String st = (String) request.getSession().getAttribute("st");
if (secretToken.equals(st)) {
try {
connection.login(new ExternalUserCredentials("admin"));
} catch (LoginException e) {
log.warn("Unable to login by token {}", st);
}
}
}
}
}
Вход осуществляется по ссылке:
localhost:8080/app?st=e63cacd4-646b-4232-bd72-36ddff780bbf
Оба примера в проекте: logindemo.zip (79,3 КБ)
Чтобы попробовать второй пример закомментируйте код в ExtLoginWindow
и раскомментируйте в AppStartedEventListener
и ExternalLoginHttpFilter
.