我正在通过以下方式对我的应用程序进行自动化:
// authorize app!
$('#authApp').click(function(){
var oauth_url = 'https://www.facebook.com/dialog/oauth/';
oauth_url += '?client_id=#{app.id}';
oauth_url += '&redirect_uri=' + encodeURIComponent('https://www.facebook.com/pages/null/#{fbPageId()}/?sk=app_#{app.id}');
oauth_url += '&scope=user_likes,user_photos';
oauth_url += '&app_data=7B%27game%27%3A+%27key%27%7D';
oauth_url += '&state=sbSbsbSb';
如您所见,我将“状态”参数设置为查询字符串的一部分。现在,当用户授权应用程序时,他将被重定向到重定向 url。
但是,在 state 参数中传递的数据不会发布到我的应用程序,也不是我的应用程序 iframe 查询字符串的一部分。我希望在签名请求中找到它,但没有。这是授权后发回的反序列化签名请求
{ algorithm: 'HMAC-SHA256',
expires: 1348927200,
issued_at: 1348921162,
oauth_token: 'AAA...',
page: { id: '490...', liked: true, admin: false },
user: { country: 'ec', locale: 'en_US', age: { min: 21 } },
user_id: '1...' }
我确实看到该状态包含在父页面的查询字符串中。我需要从我的应用程序(在 iframe 中运行)访问该参数。我相信由于同源策略限制,我不能只访问父页面的窗口位置。
我已阅读文档并在线搜索。跨应用程序授权持久化数据需要使用 state 参数完成。但是,没有说明一旦重定向回您的应用程序如何检索该状态参数。
这是来自关于状态参数的facebook 文档:
用于维护请求和回调之间的应用程序状态的唯一字符串。当 Facebook 将用户重定向回您的 redirect_uri 时,此参数的值将包含在响应中。您应该使用它来防止跨站点请求伪造。
我应该从父页面查询字符串中获取状态数据吗?还是我做错了什么?
* 编辑* 我将用户存储到状态参数中的用户请求 ID。例如,A 通过 Facebook 请求邀请 B 参与应用程序。一旦 B 授权应用程序 A 需要得到奖励。所以我需要知道 B 在 A 的邀请下来到了应用程序。因此,我将 requestId 存储在 state 参数中,因此一旦 B 授权了应用程序,我就可以采取适当的措施。
* 编辑 2(解决方案) ** 如果您的 redirect_uri 指向页面标签 URL,那么 facebook 将不会发回状态参数!仅当您重定向到 Canvas URL 时才会发回!!!!!!