Как получить providerUserId по providerId, accessToken и секрету? (Весенний социальный)

В моем приложении я могу идентифицировать пользователя по providerId и providerUserId. Но изначально у меня есть только следующая информация:

  • идентификатор поставщика,
  • доступТокен,
  • секрет.

Таким образом, мне нужно получить providerUserId по этой информации.

Я пытаюсь использовать следующий код:

ConnectionData connectionData = newConnectionData(providerId, accessToken, secret);

ConnectionFactory<?> connectionFactory = connectionFactoryLocator.getConnectionFactory(providerId);
Connection<?> connection = connectionFactory.createConnection(connectionData);

if(connection.test()) {
    connection.sync();
} else {
    throw new AuthException();
}

return userEntityService.findOneByConnectionKey(connection.getKey());

Но проблема в том, что ключ подключения не инициализирован: providerUserId имеет значение null.

Как я могу получить его в этом случае?


person Victor Dombrovsky    schedule 07.11.2015    source источник


Ответы (2)


Как правило, этот код предназначен для внутреннего использования инфраструктурой соединений Spring Social (например, ConnectController, ConnectionRepository, ConnectionFactory и т. д.). Обычно вы не будете использовать его напрямую, если не хотите расширить инфраструктуру или добиться чего-то, чего инфраструктура не делает для вас.

Идентификатор поставщика определяется используемой фабрикой соединений. Например, FacebookConnectionFactory определяет его как «facebook». Для Твиттера это «твиттер». Значение не очень важно, за исключением того, что оно должно (1) последовательно использоваться для всех подключений к одному и тому же провайдеру и (2) быть уникальным среди всех провайдеров. Как правило, лучше просто использовать имя провайдера в нижнем регистре.

Токен доступа получается путем прохождения «танца» OAuth (например, серии перенаправлений и запросов на получение авторизации пользователя). ConnectController сделает это за вас... как и ProviderSignInController. Если токен является токеном OAuth2, секрета не будет. Если это токен OAuth 1.0(a), то в конце танца вам будет предоставлен секрет вместе с токеном.

person Craig Walls    schedule 09.11.2015
comment
Я попытаюсь объяснить, почему я использую этот код. Мой код предназначен для защиты доступа к моему REST API. Я хочу, чтобы только зарегистрированные пользователи могли получить к нему доступ. Зарегистрированные пользователи имеют свойства providerId и providerUserId. Эта комбинация может быть использована для идентификации пользователя. Когда пользователь пытается получить доступ к моему API, он отправляет providerId, accessToken и, возможно, секрет, который он получил во время танца OAuth на стороне клиента. - person Victor Dombrovsky; 09.11.2015
comment
Как только информация была получена сервером, сервер проверяет правильность соединения. И если он действителен, сервер должен проверить наличие пользователя в базе данных. Вот почему мне нужно получить providerUserId, используя доступную информацию. - person Victor Dombrovsky; 09.11.2015
comment
В настоящее время я изучил исходные коды фреймворка и нашел решение. Spring Social использует: Long.toString(twitter.userOperations().getProfileId()) и google.plusOperations().getGoogleProfile().getId() для этой цели. Но, может быть, вы дадите мне совет: может быть, мне нужно сделать то, что я делаю, по-другому, используя этот фреймворк? - person Victor Dombrovsky; 09.11.2015

Однако немного поздно, если вы следуете «философии» spring-social, есть таблица UserConnection. Вы можете запросить его для providerUserId.

Схема находится в JdbcUsersConnectionRepository.sql:

-- This SQL contains a "create table" that can be used to create a table that JdbcUsersConnectionRepository can persist
-- connection in. It is, however, not to be assumed to be production-ready, all-purpose SQL. It is merely representative
-- of the kind of table that JdbcUsersConnectionRepository works with. The table and column names, as well as the general
-- column types, are what is important. Specific column types and sizes that work may vary across database vendors and
-- the required sizes may vary across API providers. 

create table UserConnection (userId varchar(255) not null,
providerId varchar(255) not null,
providerUserId varchar(255),
rank int not null,
displayName varchar(255),
profileUrl varchar(512),
imageUrl varchar(512),
accessToken varchar(512) not null,
secret varchar(512),
refreshToken varchar(512),
expireTime bigint,
primary key (userId, providerId, providerUserId));
create unique index UserConnectionRank on UserConnection(userId, providerId, rank);
person kmansoor    schedule 22.01.2016