根本无法理解spring社交,特别是ProviderSignInController

时间:2014-07-20 19:27:55

标签: spring spring-social spring-social-facebook

我想了解ProviderSignInController的作用,但我很难理解它。

因此,当我点击登录facebook时,我会进入Facebook登录页面,而不是在输入我的凭据后,会调用以下方法

org.springframework.social.connect.web.ProviderSignInController.oauth1Callback(String, NativeWebRequest)
/**
 * Process the authentication callback from an OAuth 2 service provider.
 * Called after the user authorizes the authentication, generally done once by having he or she click "Allow" in their web browser at the provider's site.
 * Handles the provider sign-in callback by first determining if a local user account is associated with the connected provider account.
 * If so, signs the local user in by delegating to {@link SignInAdapter#signIn(String, Connection, NativeWebRequest)}.
 * If not, redirects the user to a signup page to create a new account with {@link ProviderSignInAttempt} context exposed in the HttpSession.
 * @see ProviderSignInAttempt
 * @see ProviderSignInUtils 
 */
@RequestMapping(value="/{providerId}", method=RequestMethod.GET, params="code")
public RedirectView oauth2Callback(@PathVariable String providerId, @RequestParam("code") String code, NativeWebRequest request) {
    try {
        OAuth2ConnectionFactory<?> connectionFactory = (OAuth2ConnectionFactory<?>) connectionFactoryLocator.getConnectionFactory(providerId);
        Connection<?> connection = connectSupport.completeConnection(connectionFactory, request);
        return handleSignIn(connection, connectionFactory, request);
    } catch (Exception e) {
        logger.error("Exception while completing OAuth 2 connection: ", e);
        return redirect(URIBuilder.fromUri(signInUrl).queryParam("error", "provider").build().toString());
    }
}

我不明白的是它通过首先确定本地用户帐户是否与所连接的提供商帐户相关联来处理提供商登录回调。

并在第二行显示如果是这样,通过委托给{@link SignInAdapter#signIn(String,Connection,NativeWebRequest)}来签署本地用户

我明白了。

但是我无法理解这句话如果没有,请将用户重定向到注册页面以创建一个在HttpSession中公开{@link ProviderSignInAttempt}上下文的新帐户。

我现在想的是,当我第一次尝试使用Facebook登录时...连接存储库中没有用户....所以每次我都会被重定向到注册页面。春天的社交意味着你不必注册并使用facebook凭据。

所以我无法理解这一切背后的逻辑是什么。

1 个答案:

答案 0 :(得分:6)

您的理解并不完全准确。 ProviderSignInController的典型工作方式是您描述它的方式。它的工作原理是首先通过Facebook(或其正在处理的任何提供商)获得用户授权,然后使用该授权来获取用户的ID。然后,它将用户的ID与先前建立的连接(可能使用ConnectController进行)进行比较,并验证与该连接相关联的用户。在这种情况下,必须有现有用户,并且该用户必须先与Facebook建立连接。

如果找不到匹配的连接,则它会提供应用程序的注册/注册屏幕,供用户注册您的应用程序。 (这假定用户尚未注册。)注册后,应用程序可以选择完成连接...即为新注册的用户创建新连接。它通过在ProviderSignInUtils上调用postSignUp()来实现。 Spring Social Showcase在SignupController中执行此操作:https://github.com/spring-projects/spring-social-samples/blob/master/spring-social-showcase/src/main/java/org/springframework/social/showcase/signup/SignupController.java

但是,还有另一种方法,它不需要现有连接,也不需要您的应用程序甚至维护用户数据库。这种方法被称为&#34;隐式注册&#34;,这意味着通过Facebook授权,用户会在您的应用程序中隐式注册。要使用隐式注册,必须将SignInAdapter实例注入JdbcUsersConnectionRepository。要查看此操作,请查看SocialConfig.java以获取Spring Social快速入门示例:https://github.com/spring-projects/spring-social-samples/blob/master/spring-social-quickstart/src/main/java/org/springframework/social/quickstart/config/SocialConfig.java

请注意,隐式注册(因为它当前已实现)是JdbcUsersConnectionRepository的函数,而不是更通用的UsersConnectionRepository。这很不幸,因为这意味着只有在您使用JdbcUsersConnectionRepository或者您使用的任何UsersConnectionRepository实现支持它时才能使用该功能。这已经让我误解了一段时间,所以我创建了https://jira.spring.io/browse/SOCIAL-439来解决这个问题。

相关问题