Spring FacebookTemplate 引发用户配置文件的权限异常
Spring FacebookTemplate raises permission exception for user profile
我无法使用从后台服务在 iOS 客户端上获得的令牌继续 OAuth 会话。具体来说,它看起来是一个权限问题:
iOS客户端获取访问令牌(ObjC/FBiOSSDK 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)
使用上面得到的token实例化了一个SpringFacebookTemplate
,如下:
@Test fun testFacebookTemplate()
{
val facebook = FacebookTemplate("$$TOKEN_FROM_FACEBOOK_IOS_SDK$$")
//Raises exception . .
val profile = facebook.userOperations().userProfile
println("Profile: " + profile)
}
在 iOS 客户端上建立的 OAuth 会话从后端成功继续,例如,可以 returned 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
问题:
- 缺少 return User object. This does not appear to be documented in Spring's FacebookTemplate
的权限
- 这是在 OAuth authentication/authorization 期间请求的(在我的情况下使用 FB iOS SDK)还是通过开发者控制台?这对我来说并不清楚,因为 openActiveSessionWithPermissions 和 Facebook 的 Web 控制台中的应用程序定义都包含对这些权限的引用。
似乎 Spring 的 FacebookTemplate v2.0.2.RELEASE 在针对 Facebook Graph API v2.3 调用用户配置文件请求时出现一些与权限相关的错误
作为变通方法使用:
val profile = facebook.fetchObject("me", User::class.java,
"id", "first_name", "last_name", "email");
在 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;
}
Facebook 用户所在的位置:
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;
}
我无法使用从后台服务在 iOS 客户端上获得的令牌继续 OAuth 会话。具体来说,它看起来是一个权限问题:
iOS客户端获取访问令牌(ObjC/FBiOSSDK 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)
使用上面得到的token实例化了一个SpringFacebookTemplate
,如下:
@Test fun testFacebookTemplate()
{
val facebook = FacebookTemplate("$$TOKEN_FROM_FACEBOOK_IOS_SDK$$")
//Raises exception . .
val profile = facebook.userOperations().userProfile
println("Profile: " + profile)
}
在 iOS 客户端上建立的 OAuth 会话从后端成功继续,例如,可以 returned 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
问题:
- 缺少 return User object. This does not appear to be documented in Spring's FacebookTemplate 的权限
- 这是在 OAuth authentication/authorization 期间请求的(在我的情况下使用 FB iOS SDK)还是通过开发者控制台?这对我来说并不清楚,因为 openActiveSessionWithPermissions 和 Facebook 的 Web 控制台中的应用程序定义都包含对这些权限的引用。
似乎 Spring 的 FacebookTemplate v2.0.2.RELEASE 在针对 Facebook Graph API v2.3 调用用户配置文件请求时出现一些与权限相关的错误
作为变通方法使用:
val profile = facebook.fetchObject("me", User::class.java,
"id", "first_name", "last_name", "email");
在 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;
}
Facebook 用户所在的位置:
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;
}