维护用户会话(在Facebook O-Auth,服务器端登录之后)

时间:2012-11-01 19:20:23

标签: facebook session cookies oauth-2.0 session-cookies

我正在编写一个使用O-Auth"与Facebook连接的移动应用程序"为了:

1) Let Facebook deal with the authentication
2) Not force my users to register to another website
3) Get Facebook information

我已经实施了Facebook的服务器端登录(在JAVA中):

https://developers.facebook.com/docs/howtos/login/server-side-login/

我不明白一旦用户连接了facebook,我该如何维护用户会话。

这是从端到端的流程,如果我错了,请纠正我。

1) The user logs into my server (Android APP using WebView)
2) The server redirect the user to Facebook (with client_id, redirect_url, state and permissions)
3) The user is now facing Facebook's login dialog.
  3.1) If the user deny: Facebook calls the redirect_url and notify the server that there was an error. (Flow Ends here)
  3.2) If the user accept: Facebook calls the redirect_url (my server) with the state i've set (for CSRF protection) and a code.
4) The server contacts Facebook and send it the app_id, redirect_url, client_secret and code and in return, facebook calls the redirect_url with a valid token. This token allows the server to issue facebook API calls on behalf of the user.

到目前为止一切都很好。现在回答主要问题 - 会话管理。

现在我获得了令牌,我需要弄清楚它属于哪个用户,这样我就可以从我的数据库中获取数据或创建一个新条目(如果是新用户)。

1)我应该使用哪种标识符来识别服务器数据库中的用户? (我是否需要调用Facebook API来检索基本信息,并从中提取电子邮件和/或唯一ID?

2)获得此唯一ID后,如何再次与用户联系?在步骤2,服务器将他重定向到Facebook,这意味着他打开了与Facebook的新连接,并且他不再连接到服务器。现在,如果他已经离开,我怎么设置他? < - * 这部分对我来说最让人困惑。 *

3)在什么时候我需要在用户的请求上设置一个SESSION ID(cookie),以便下次他与我联系时我会知道它是谁。

我认为Stack溢出是说明我的问题的最好例子。 我点击了"与Facebook连接"按钮,突然我在Stack溢出的用户没有任何注册。 Stack溢出如何知道如何提出我已经问过的问题?它是如何识别我的?在我所描述的链中的哪一点上,我根据我的要求设置了一个cookie?

感谢您的时间

1 个答案:

答案 0 :(得分:0)

  1. 您遇到过关于OAuth的一个基本误解:OAuth与授权有关。用户客户端)授予代表 访问数据的权限。如果您想验证用户,则某些提供商允许您访问允许您区分用户的唯一ID 。所以,是的,如果你想识别一个用户,你必须要求他的唯一ID

  2. 有多种方法可以做到这一点。所有这些都是为了生成唯一会话ID ,您可以在重定向用户之前存储。一旦用户回来,他就会向您返回 id 。如果您看到,您发布并存储了 ID ,则会删除 ID ,并且您知道您正在与哪个用户进行通话。您可以将此 ID 存储在Cookie中,也可以将其作为state参数的一部分移交。

  3. 在重定向之前的任何时候都可以。如果您想知道您正在与哪个用户通话,请在他第一次给您打电话时这样做。