我有一个使用Oauth2身份验证(密码授予类型)的Spring Boot应用程序。我现在需要支持Facebook和Twitter登录。
我正在使用自定义TokenGranter来允许客户端向我发送Facebook访问令牌或Twitter使用者ID和秘密,以便他们可以登录到我的服务器应用程序并接收我生成的OAuth2 access_token。我使用FacebookConnectionFactory
:
Connection<Facebook> connection = facebookConnectionFactory.createConnection(new AccessGrant(providerToken));
通过连接,我获得了Facebook的用户ID:
String providerUserId = connection.getKey().getProviderUserId();
使用此ID,我搜索我的UserRepository
中是否有这样的用户,如果有,我登录用户:
CustomUserDetails userDetails = new CustomUserDetails(user);
userAuth = new SocialAuthenticationToken(connection, userDetails,
null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(userAuth);
一切正常。对Twitter做同样的事情:
Connection<Twitter> connection = twitterConnectionFactory.createConnection(new OAuthToken(providerToken, tokenSecret));
给我这个例外:
Unable to connect with Twitter: Authorization is required for the operation,
but the API binding was created without authorization.
我觉得奇怪的是,使用具有相同应用ID和密码以及消费者和消费者秘密的TwitterTemplate
确实有效。
TwitterTemplate twitterTemplate = new TwitterTemplate(...);
UserOperations userOperations = twitterTemplate.userOperations();
AccountSettings accountSettings = userOperations.getAccountSettings();
我需要Connection<Twitter>
的{{1}}对象。我做错了什么?
答案 0 :(得分:0)
愚蠢的错误,我有:
@Value("spring.social.twitter.app-id")
private String twitterAppId;
@Value("spring.social.twitter.app-secret")
private String twitterAppSecret;
代替:
@Value("${spring.social.twitter.app-id}")
private String twitterAppId;
@Value("${spring.social.twitter.app-secret}")
private String twitterAppSecret;
所以我把文字spring.social.twitter.app-id
而不是属性的值。