8

我对 facebook sdk 3.0 中的新 FBSession 重新授权(reauthorizeWithPermissions: behavior: completionHandler:) 有一些疑问:

一旦有人在我的应用程序上通过 facebook 登录,在某些页面上,我想使用他/她的 facebook 凭据重新验证用户。这是为了确保查看页面的人和首字母登录的人是相同的。重新授权的权限与登录相同。我需要的是重新确认用户密码以确保这种情况。

因此我使用 reauthorisationWithPermissions: 来做到这一点。我将行为设置为 FBSessionLoginBehaviorForcingWebView 以确保用户被迫输入他/她的凭据。但是,这根本不起作用。它只是弹出一个空白的 webview 几秒钟然后消失......此时,它调用状态设置为 FBSessionStateOpen 的 FBSesstionStateHandler 块,但是,无法调用 (completionHandler:) 中定义的 FBSessionReauthorizeResultHandler。

但是,如果我只是将行为设置为默认值(FBSessionLoginBehaviorWithFallbackToWebView),它可以通过在 facebook app/safari 之间来回传递请求并通过正确调用 completionHandler 来完成调用。但是,默认行为不会强制用户重新输入他/她的密码。

所以我真的很困惑,网络上的 sdk 文档对我的情况并不是很有用。有人可以告诉我我做错了什么......或者它是SDK中的一个已知错误?如果是这样,我该如何满足我的要求?

-(void) reauthThroughFacebook {

if ( !self.facebookSession.isOpen && self.facebookSession.state == FBSessionStateCreatedTokenLoaded) {
    [self.facebookSession openWithBehavior: FBSessionLoginBehaviorWithNoFallbackToWebView 
                         completionHandler: self.stateHandler];
} 

if ( self.facebookSession.isOpen ) {
    [self.facebookSession reauthorizeWithPermissions: self.userPermissions
                                            behavior: FBSessionLoginBehaviorForcingWebView
                                   completionHandler:^(FBSession *session, NSError* error){
                                       if (self.facebookSession == session) {
                                           [self completedReauthWithSuccess:(error == nil) error:error];
                                       }
                                   }];
} else {
    [self completedReauthWithSuccess:NO error:[NSError errorWithDomain: @"No active session found."
                                                                  code: FBErrorInvalid userInfo: nil]];
}

}

此外,一旦 reauth web 视图正确弹出,我如何确保自动填充用户的电子邮件地址并阻止用户表单更改它?我可以访问 facebook sdk 中的 Web 视图来设置这些属性吗?

最后,如果使用与登录相同的权限进行重新身份验证,访问令牌和到期日期会发生什么变化?

先感谢您,

4

1 回答 1

0

这是个有趣的问题。我还没有编码,所以我不知道这是否可行,但考虑到 FB 会话的工作方式,这是我对一种方法的最佳猜测。

使用一个 FB 会话,我认为您无法做到这一点。在给定的会话中,FB auth 是二进制的,无论用户是否登录(即有一个打开的会话)。各种 reauth 方法旨在使用附加权限进行身份验证,现在已弃用,取而代之的是请求附加权限的方法。

通过支持多个 FB 会话,您可能能够完成接近您想要的事情。二级身份验证与允许第二个 FB 用户登录您的应用程序基本相同。然后,您将在适当的时间关闭第二个会话。您可以通过比较 FB 用户 ID 来强制两个会话是同一个 FB 用户。

理解会话文档的最后一段中,FB 讨论了支持多个会话。

于 2013-04-17T01:56:10.910 回答