使用 Objective-C 和 C++ 实现 X-FACEBOOK-PLATFORM 身份验证的身份验证失败

Posted

技术标签:

【中文标题】使用 Objective-C 和 C++ 实现 X-FACEBOOK-PLATFORM 身份验证的身份验证失败【英文标题】:Auth failure implementing X-FACEBOOK-PLATFORM authentication using Objective-C and C++ 【发布时间】:2011-11-16 23:59:57 【问题描述】:

我在 Objective C 中实现 X-FACEBOOK-PLATFORM XMPP 身份验证(但主要使用 C++ 代码),但总是失败: <failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized/></failure>

我已经注册了应用,Id和Secret如下:

FacebookId @“136973476410894” FacebookSecret @"f6e269fe158b4a04d00ce8b311453ccd"

我使用 FBConnect 检索会话令牌,请求权限: @"publish_stream" ,@"xmpp_login" , @"offline_access"

Session 令牌在代码中称为令牌(见下文)

然后程序要求认证机制: <auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="X-FACEBOOK-PLATFORM"/>

接受挑战:<challenge xmlns="urn:ietf:params:xml:ns:xmpp-sasl">dmVyc2lvbj0xJm1ldGhvZD1hdXRoLnhtcHBfbG9naW4mbm9uY2U9OTAzMTM5MjY2ODk3N0Q0ODMyNDQ2MDY1REMzMTE5RTc=</challenge>

然后是从挑战中提取的 Facebook Auth 正文: version=1&method=auth.xmpp_login&nonce=9031392668977D4832446065DC3119E7。 键:版本,值:1。 键:方法,值:auth.xmpp_login。 键:nonce,值:9031392668977D4832446065DC3119E7。 令牌:“BAAB8k59ntg4BANNuTHAkjTZBk3pW8pZBD7jWIpZBt8cf65oAT4eDm9euloGCX9NzfF9HwKQxUdEQ15YfeFtkdZAHVpkjL0j4CF0lZCQeuNTBXrvkbtUXC” APIkey:“136973476410894” APISecret: "f6e269fe158b4a04d00ce8b311453ccd"

使用下面的代码构建响应:

token = 来自 FB 连接的会话令牌:(BAAB8k59ntg4BANNuTHAkjTZBk3pW8pZBD7jWIpZBt8cf65oAT4eDm9euloGCX9NzfF9HwKQxUdEQ15YfeFtkdZAHVpkjL0j4CF0lZCQeuNTBXrvkbtUXC)

APIkey = FacebookId (136973476410894);

APISecret = FacebookSecret (f6e269fe158b4a04d00ce8b311453ccd);

string call_id=[[NSString stringWithFormat:@"%0.0f", [[NSDate date] timeIntervalSince1970]] UTF8String];
string signature1 = "api_key=" + APIkey
+ "call_id=" + call_id
+ "method=auth.xmpp_login"
+ "nonce=" + nonce
+ "session_key=" + token
+ "v=1.0"
+ APISecret;

string md = MD5(signature1);

//std::transform(md.begin(), md.end(),md.begin(), ::tolower);
string response2 = "method=auth.xmpp_login&api_key=" + APIkey + "&session_key=" +token + "&call_id=" + call_id + "&sig=" + md + "&v=1.0&" + "nonce=" + nonce;

printf("++base64EncodedResponse response2: %s.\n", response2.c_str());

string response2Base64 = Base64::Encode(response2);

内置回复:method=auth.xmpp_login&api_key=136973476410894&session_key=BAAB8k59ntg4BANNuTHAkjTZBk3pW8pZBD7jWIpZBt8cf65oAT4eDm9euloGCX9NzfF9HwKQxUdEQ15YfeFtkdZAHVpkjL0j4CF0lZCQeuNTBXrvkbtUXC&call_id=1321457495&sig=5f376192b2dd1f5f928f651a996ce757&v=1.0&nonce=9031392668977D4832446065DC3119E7

Stanza sent(response): <response xmlns="urn:ietf:params:xml:ns:xmpp-sasl">bWV0aG9kPWF1dGgueG1wcF9sb2dpbiZhcGlfa2V5PTEzNjk3MzQ3NjQxMDg5NCZzZXNzaW9uX2tleT1CQUFCOGs1OW50ZzRCQU5OdVRIQWtqVFpCazNwVzhwWkJEN2pXSXBaQnQ4Y2Y2NW9BVDRlRG05ZXVsb0dDWDlOemZGOUh3S1F4VWRFUTE1WWZlRnRrZFpBSFZwa2pMMGo0Q0YwbFpDUWV1TlRCWHJ2a2J0VVhDJmNhbGxfaWQ9MTMyMTQ1NzQ5NSZzaWc9NWYzNzYxOTJiMmRkMWY1ZjkyOGY2NTFhOTk2Y2U3NTcmdj0xLjAmbm9uY2U9OTAzMTM5MjY2ODk3N0Q0ODMyNDQ2MDY1REMzMTE5RTc=</response>

然后服务器返回: <failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized/></failure>

我不知道问题出在哪里,它看起来对我来说是正确的,但是没有办法进行身份验证。有谁知道是否有任何方法可以用服务器调试失败的原因?可能是该应用程序尚未在 App Store 中?

如果有人可以提供帮助将非常受欢迎!

【问题讨论】:

【参考方案1】:

由于没有人响应,并且由于此代码出现在有关 Facebook 身份验证的一些示例中,因此其他人可能会被同样的错误所欺骗 - 我将自己发布响应。

一切都差不多了,只需要在 signature1 字符串和 response2 字符串中为 access_token 更改标签 session_key

【讨论】:

以上是关于使用 Objective-C 和 C++ 实现 X-FACEBOOK-PLATFORM 身份验证的身份验证失败的主要内容,如果未能解决你的问题,请参考以下文章

初探 Objective-C/C++ 异常处理实现机制

Objective-C 使用 C++类

objective-c和c++的区别

C++和Objective-C混编(官方文档翻译)

如何在c++中,调用objective-c

Objective-C 和 C++ 的区别都有哪些?为啥苹果会选择前者