У меня есть Keycloak (автономный) v1.9.4. Окончательная настройка установки с использованием Wildfly 10 на экземпляре AWS, и я пытаюсь использовать keycloak (через страницу входа в keycloak) и Twitter4j для аутентификации пользователя с помощью Twitter, а затем, очевидно, мое приложение аутентифицируется и просматривается временная шкала пользователей и т. д.
Я настроил поставщика удостоверений (Twitter), область и свое клиентское приложение.
У меня также есть установка приложения Twitter на apps.twitter.com и ключи, помещенные в мой файл twitter4j.properties.
На данный момент я могу:
- Перейдите на веб-страницу JSF моего приложения и перенаправляйтесь на страницу входа /auth Keycloak.
- Нажмите на логотип Twitter и войдите в свою учетную запись Twitter (отдельная учетная запись от учетной записи, которой принадлежит приложение Twitter)
- Заполните информацию о пользователе, которую запрашивает Keycloak.
- После заполнения информации о пользователе Keycloak успешно направляет пользователя обратно в клиентское приложение (в данном случае на страницу JSF).
Проблема в том, что я не могу понять, как получить доступ к пользователям OAuth AccessToken и AccessTokenSecret для объединения с ConsumerKey и ConsumerKeySecret приложения Twitter.
Ниже приведены соответствующие фрагменты кода:
twitterLogin.xhtml
...
#{twitterBean.getUserInfo()}
...
TwitterBean.java
@Context
private final FacesContext facesContext = FacesContext.getCurrentInstance();
private final Twitter twitter = TwitterFactory.getSingleton();
public String getUserInfo() {
if (facesContext != null) {
HttpSession httpSession = (HttpSession) facesContext.getExternalContext().getSession(false);
KeycloakSecurityContext keycloakContext = (RefreshableKeycloakSecurityContext) httpSession.getAttribute(KeycloakSecurityContext.class.getName());
queryTwitter(keycloakContext.getTokenString(), keycloakContext.getIdTokenString());
}
}
public void queryTwitter(String accessToken, String accessTokenSecret) {
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true)
.setOAuthConsumerKey("APPLICATIONS_CONSUMER_KEY")
.setOAuthConsumerSecret("APPLICATIONS_CONSUMER_KEY_SECRET")
.setOAuthAccessToken(accessToken)
.setOAuthAccessTokenSecret(accessTokenSecret);
TwitterFactory tf = new TwitterFactory(cb.build());
twitter = tf.getInstance();
user = twitter.verifyCredentials();
...
}
В зависимости от того, как мы размещаем различные токены (попробовав разные строки токенов в разных местах), мы получаем разные ошибки, возвращаемые Twitter при вызове verifyCredentials(), но все они по сути являются «недействительной аутентификацией».
Для нас очевидно, что методы .getTokenString() и .getIdTokenString() не являются правильными для использования, но мы не знаем, где Keycloak может предоставить токены oauth пользователя.
Мы безуспешно пытались посмотреть на FaceContext.getExternalContext().getRequest() и FacesContext.getExternalContext().getResponse().
Мой вопрос: когда Keycloak перенаправляет обратно в клиентское приложение (поставщик услуг) после того, как пользователь аутентифицируется в Twitter и регистрирует пользователя в Keycloak, где хранятся токены oauth, чтобы мы могли получить к ним доступ, а затем выполнить двойную аутентификацию (Application/ Аутентификация пользователя)?