2

我无法使用在 iOS 客户端上从后端服务获得的令牌继续 OAuth 会话。具体来说,它看起来是一个权限问题:

iOS客户端获取Access Token(ObjC/FB iOS SDK v3.24)

使用以下权限建立的会话:

[FBSession openActiveSessionWithReadPermissions:@[
                @"email",
                @"user_about_me",
                @"user_friends",
                @"user_birthday",
                @"public_profile" . . . 

在结束的时候 。. .

FBSession *session = [FBSession activeSession];
NSString *accessToken = [session.accessTokenData accessToken];

发送到后端的访问令牌(即 Spring Boot + Kotlin)

使用上面获得的令牌实例化一个 Spring FacebookTemplate,如下所示:

@Test fun testFacebookTemplate()
{
    val facebook = FacebookTemplate("$$TOKEN_FROM_FACEBOOK_IOS_SDK$$")

    //Raises exception . . 
    val profile = facebook.userOperations().userProfile 
    println("Profile: " + profile)
}

iOS客户端建立的OAuth会话从后端继续成功,例如可以返回Facebook好友列表。但是,如上所示,尝试检索配置文件会引发错误:

Error from Facebook: {"error":{"message":"(#3) Application does not have the capability to make this API call." , "type":"OAuthException","code":3,"fbtrace_id":"B4C+eS3n2PW"}}
DEBUG o.s.s.f.a.impl.FacebookErrorHandler - Facebook error: 
DEBUG o.s.s.f.a.impl.FacebookErrorHandler -    CODE        : 3
DEBUG o.s.s.f.a.impl.FacebookErrorHandler -    TYPE        : OAuthException

问题:

  • 缺少返回用户对象的权限。这似乎没有记录在 Spring 的FacebookTemplate中
  • 这是在 OAuth 身份验证/授权期间(在我的情况下使用 FB iOS SDK)还是通过开发者控制台请求的?这对我来说不清楚,因为 openActiveSessionWithPermissions 和 Facebook 的 Web 控制台中的应用程序定义都包含对这些权限的引用。
4

2 回答 2

2

在针对 Facebook Graph API v2.3 调用用户配置文件请求时,似乎 Spring 的 FacebookTemplate v2.0.2.RELEASE 有一些权限相关的错误

作为解决方法使用:

val profile = facebook.fetchObject("me", User::class.java, 
    "id", "first_name", "last_name", "email");
于 2015-10-23T23:50:56.847 回答
1

facebook API 更改后,字段“first_name”被替换为字段:“name”

public FacebookUser getFacebookUserData() {
    Facebook facebook = new FacebookTemplate(accessToken);
    String[] fields = {"id", "name", "email"};
    FacebookUser user = facebook.fetchObject("me", FacebookUser.class, fields);
    return user;
}

FacebookUser 在哪里:

public class FacebookUser {

String id;
String name;
String email;

public FacebookUser(){ }

public FacebookUser(String id, String name, String email) {
    this.id = id;
    this.name = name;
    this.email = email;
}
于 2019-01-15T08:23:01.450 回答