使用新图形 API 在 Facebook Canvas 应用中进行身份验证

5 投票
2 回答
7035 浏览
提问于 2025-04-16 01:39

我正在开发一个Facebook画布应用,它会在一个iframe中加载,使用的是Django框架。我希望登录过程能像Zynga那样工作。具体来说,如果用户没有登录,就会被重定向到Facebook的登录页面,然后再跳转到应用的权限请求页面(而不是弹出窗口)。

根据我的了解,Zynga可能在使用FBML,并且直接转发到看起来像这样的URL:

http://www.facebook.com/login.php?api_key=[api_key]&canvas=1&fbconnect=0&next=[return_url]

有没有办法在一个加载在iframe中的Python应用中实现类似的效果呢?

这里有一个方法可以参考,它展示了如何使用新的PHP SDK实现正确的重定向,但我想使用新的Python SDK,它只有以下方法:

def get_user_from_cookie(cookies, app_id, app_secret):
"""
Parses the cookie set by the official Facebook JavaScript SDK.
cookies should be a dictionary-like object mapping cookie names to
cookie values.
...
"""

我有一些使用JavaScript SDK和get_user_from_cookie方法的工作代码:

<div id="fb-root">
 <script src="http://connect.facebook.net/en_US/all.js"></script>
</div>

<script type="text/javascript">
 FB.init({ apiKey: 'apikey', status: true, cookie: true, xfbml: true});

 FB.Event.subscribe('auth.login', function(response) {
  // Reload the application in the logged-in state
  window.top.location = 'http://apps.facebook.com/myapp/';
 });
</script>
<fb:login-button>Install MyApp</fb:login-button>

这个方法的问题在于,它需要用户点击一个按钮来登录,然后还要通过弹出认证界面。(注意:如果我直接调用FB.login,也会出现弹出窗口)

所以……有没有办法使用JavaScript SDK重定向到登录页面,而不是以弹出窗口的形式加载呢?

谢谢任何帮助!

--Eric

2 个回答

0

你应该按照文档中关于Canvas应用程序中的身份验证的说明来使用OAuth。

你现在使用的Python SDK里面有一个示例,你几乎可以直接使用它。

13

有没有办法用JavaScript SDK直接跳转到登录页面,而不是以弹窗的形式加载呢?

没有。JavaScript SDK会打开一个新窗口,而不是在当前窗口中跳转。

如果你想让用户看到一个全屏的授权对话框,你需要把他们重定向到 https://graph.facebook.com/oauth/authorize?client_id={{ application_id }}&redirect_uri={{ redirect_uri }}。需要注意的是,你不能通过服务器端的代码来实现这个,因为那样只会重定向iframe,而Facebook是不允许的。你需要一个中间文档来重定向父窗口。

<!DOCTYPE html>

<!--
This document redirects the parent window to the authorization
dialog automatically, or falls back to a link if the client does not
support JavaScript.
-->

<html>
  <head>
    <script type="text/javascript">
      window.parent.location = 'https://graph.facebook.com/oauth/authorize?client_id={{ application_id }}&redirect_uri={{ redirect_uri }}';
    </script>
  </head>

  <body> 
    You must <a target="_top" href="https://graph.facebook.com/oauth/authorize?client_id={{ application_id }}&redirect_uri={{ redirect_uri }}">authorize this application</a> in order to proceed.
  </body>
</html>

一旦用户授权了你的应用,他们会被重定向到你在 redirect_uri 中指定的地址,Facebook会把GET参数 signed_request 填充上各种有用的信息(可以参考关于签名请求的文档),这些信息可以用来代表用户向Facebook发起请求。

另外,如果你打算在canvas应用中把这个签名请求(或者其他任何东西)保存到cookie里,你需要在你的头部设置紧凑的P3P策略;否则,所有版本的Internet Explorer都会忽略你的cookies。

P3P: CP="IDC CURa ADMa OUR IND PHY ONL COM STA"

我写了一个库,可以很方便地用Django制作Facebook canvas应用,它会为你处理这些事情。这个库叫做Fandjango,可以在github上找到。

撰写回答