根本无法理解spring social,尤其是ProviderSignInController

根本无法理解spring social,尤其是ProviderSignInController,spring,spring-social,spring-social-facebook,Spring,Spring Social,Spring Social Facebook,我试图理解ProviderSignInControl的功能,但我很难理解它 因此,当我单击“使用facebook登录”时,我会进入facebook登录页面,然后在输入凭据后,调用以下方法 org.springframework.social.connect.web.ProviderSignInController.oauth1Callback(String, NativeWebRequest) /** * Process the authentication callback from an

我试图理解ProviderSignInControl的功能,但我很难理解它

因此,当我单击“使用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());
    }
}
org.springframework.social.connect.web.ProviderSignInControl.oauth1Callback(字符串,NativeWebRequest)
/**
*处理来自OAuth 2服务提供商的身份验证回调。
*在用户授权身份验证后调用,通常通过让用户在提供商站点的web浏览器中单击“允许”来完成一次。
*通过首先确定本地用户帐户是否与连接的提供程序帐户关联,处理提供程序登录回调。
*如果是这样的话,通过委托给{@link SignInAdapter#signIn(String,Connection,NativeWebRequest)}来登录本地用户。
*如果没有,则将用户重定向到注册页,以创建一个新帐户,该帐户在HttpSession中公开了{@link ProviderSigninatTest}上下文。
*@请参阅提供程序签名尝试
*@请参阅ProviderSignNutils
*/
@RequestMapping(value=“/{providerId}”,method=RequestMethod.GET,params=“code”)
公共重定向视图oauth2Callback(@PathVariable String providerId、@RequestParam(“代码”)字符串代码、NativeWebRequest请求){
试一试{
OAuth2ConnectionFactory connectionFactory=(OAuth2ConnectionFactory)connectionFactoryLocator.getConnectionFactory(providerId);
Connection Connection=connectSupport.completeConnection(connectionFactory,请求);
返回手柄信号(连接、连接工厂、请求);
}捕获(例外e){
logger.error(“完成OAuth 2连接时出现异常:”,e);
返回重定向(URIBuilder.fromUri(signInUrl).queryParam(“错误”,“提供程序”).build().toString());
}
}
我不明白的是,它说通过首先确定本地用户帐户是否与连接的提供商帐户关联来处理提供商登录回调

在第二行,如果是这样的话,则通过委托给{@link SignInAdapter#signIn(String,Connection,NativeWebRequest)}来登录本地用户

我明白了

但我无法理解这一行,它说如果没有,则将用户重定向到注册页面,以创建一个新帐户,其中{@link providersigninattent}上下文在HttpSession中公开

我现在在想,当我第一次尝试登录facebook时,连接库中将不会有任何用户。。。。所以每次我都会被重定向到注册页面。而SpringSocial意味着你不必注册和使用facebook证书


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

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

如果找不到匹配的连接,则会向上显示应用程序的注册/注册屏幕,供用户向您的应用程序注册。(假设用户尚未注册。)注册后,应用程序可以选择完成连接…即为新注册的用户创建新连接。它通过在ProviderSignInUtils上调用postSignUp()来实现这一点。Spring Social Showcase在SignupController中执行此操作:

不过,还有另一种方法不需要现有连接,也不需要应用程序维护用户数据库。这种方法被称为“隐式注册”,这意味着通过Facebook授权,用户将隐式注册到您的应用程序中。要使用隐式注册,必须将SignInAdapter的实例注入JdbcUsersConnectionRepository。要了解这一点,请查看SocialConfig.java中的Spring Social Quickstart示例:

请注意,目前实现的隐式注册是JdbcUsersConnectionRepository的一个功能,而不是更通用的UsersConnectionRepository。这是不幸的,因为这意味着只有当您使用JdbcUsersConnectionRepository或者您使用的UsersConnectionRepository的任何实现都支持它时,才能使用该功能。这个问题困扰了我一段时间,所以我创建了一个解决这个问题的工具