0

在我的应用程序中,我可以通过 providerId 和 providerUserId 识别用户。但最初,我只有以下信息:

  • 提供者 ID,
  • 访问令牌,
  • 秘密。

因此,我需要通过这些信息获取 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 为空。

在这种情况下如何获得它?

4

2 回答 2

1

通常,此代码旨在供 Spring Social 的连接框架(例如,ConnectController、ConnectionRepository、ConnectionFactory 等)在内部使用。通常,除非您希望扩展框架或实现框架不为您做的事情,否则您不会直接使用它。

提供者 ID 由正在使用的连接工厂确定。例如,FacebookConnectionFactory 将其定义为“facebook”。对于 Twitter,它是“推特”。该值并不是非常重要,除了它(1)始终用于针对同一提供程序的所有连接和(2)它在所有提供程序中是唯一的。通常,最好只使用全小写的提供者名称。

访问令牌是通过OAuth“跳舞”获得的(例如,一系列重定向和提示以获得用户授权)。ConnectController 会为您处理这个问题...... ProviderSignInController 也是如此。如果令牌是 OAuth2 令牌,则不会有秘密。如果它是 OAuth 1.0(a) 令牌,那么您将在舞会结束时获得秘密和令牌。

于 2015-11-09T15:51:32.923 回答
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);
于 2016-01-22T17:18:43.693 回答