0

在我的應用程序中,我可以通過providerId和providerUserId來識別用戶。但在最初,我只以下信息:如何通過providerId,accessToken和secret獲取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爲空。

如何在這種情況下獲得它?

回答

1

通常,此代碼旨在由Spring Social的連接框架(例如ConnectController,ConnectionRepository,ConnectionFactory等)內部使用。通常情況下,你不會直接使用它,除非你想擴展框架或實現框架不適合你的東西。

提供者ID由正在使用的連接工廠確定。例如,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

schema是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);