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 は null です。

この場合、どうすれば取得できますか?

4

2 に答える 2

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 に答える
1

通常、このコードは、Spring Social の接続フレームワーク (ConnectController、ConnectionRepository、ConnectionFactory など) によって内部的に使用されることを意図しています。通常、フレームワークを拡張したり、フレームワークが役に立たないことを達成したりしない限り、直接使用することはありません。

プロバイダー ID は、使用されている接続ファクトリーによって決定されます。たとえば、FacebookConnectionFactory はそれを「facebook」と定義します。Twitterの場合は「twitter」です。値はそれほど重要ではありませんが、(1) 同じプロバイダーに対するすべての接続で一貫して使用されること、および (2) すべてのプロバイダー間で一意であることを除きます。一般に、プロバイダーの名前をすべて小文字で使用することをお勧めします。

アクセス トークンは、OAuth の「ダンス」 (たとえば、ユーザー認証を取得するための一連のリダイレクトとプロンプト) を通過することによって取得されます。ConnectController がこれを処理します... ProviderSignInController も同様です。トークンが OAuth2 トークンの場合、シークレットはありません。OAuth 1.0(a) トークンの場合は、ダンスの最後にシークレットとトークンが提供されます。

于 2015-11-09T15:51:32.923 に答える