0

В моем приложении я могу идентифицировать пользователя через providerId и providerUserId. Но сначала, я только следующую информацию:Как получить providerUserId через providerId, accessToken и секрет? (Spring Social)

  • providerId,
  • маркер доступа,
  • секретная.

Таким образом, Мне нужно приобрести 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 равно нулю.

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

ответ

1

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

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

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

+0

Я попытаюсь объяснить, почему я использую этот код. Мой код предназначен для защиты доступа к моему REST API. Я хочу, чтобы только зарегистрированные пользователи могли получить к нему доступ. Зарегистрированные пользователи имеют свойства «providerId» и «providerUserId». Эта комбинация может использоваться для идентификации пользователя. Когда пользователь пытается получить доступ к моему API, он отправляет «providerId», «accessToken» и, возможно, «секретный», который он приобрел во время «танца» OAuth на стороне клиента. –

+0

Как только информация была получена сервером, сервер проверяет, что соединение действительно. И если это действительно так, сервер должен проверить наличие пользователя в базе данных. Вот почему мне нужно приобрести «providerUserId», используя имеющуюся информацию. –

+0

В настоящее время я изучил исходники кода и нашел решение. Spring Social использует: 'Long.toString (twitter.userOperations(). GetProfileId())' и 'google.plusOperations(). GetGoogleProfile(). GetId()' для этой цели. Но может быть, вы можете дать мне совет: может быть, мне нужно делать то, что я делаю другим способом, используя эту структуру? –

1

Немного поздно, однако, если вы следите за «философией» 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);