如何通过providerId,accessToken和secret获取providerUserId? (春季社交)

时间:2015-11-07 10:00:41

标签: spring oauth spring-social spring-social-twitter spring-social-google

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

  • providerId,
  • 的accessToken,
  • 的秘密。

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

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

2 个答案:

答案 0 :(得分:1)

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

提供商ID由正在使用的连接工厂确定。例如,FacebookConnectionFactory将其定义为&#34; facebook&#34;。对于Twitter,它是&#34; twitter&#34;。该值并非非常重要,除了它(1)始终用于针对同一提供商的所有连接,以及(2)它在所有提供商中是唯一的。通常,以全小写形式使用提供商的名称是件好事。

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

答案 1 :(得分: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);