在桌面客户端 - 服务器应用程序中集成facebook登录

时间:2011-12-10 12:18:07

标签: security facebook desktop-application

情况

我有一个桌面客户端应用程序'C'和一个服务器应用程序'S',都是用C ++编写的,驻留在不同的机器上。他们目前通过TCP进行通信。敏感的用户特定数据存储在'S'上。

当前登录流程如下:用户在“C”中输入凭据,将它们加密发送到“S”,“S”将它们与此用户在特殊数据库“D”中的凭据进行比较。如果凭据有效,则S为客户端提供特定于用户的数据。否则,连接被拒绝。新用户的注册是通过一个集中的Web服务器'将凭证发送到'S'并将它们放入'D'。

问题

我希望客户的用户能够通过当前登录屏幕上的“使用Facebook登录”按钮通过Facebook登录(目前我只有用户和通行证)。我只需要登录,没有其他集成。我将使用用户的FacebookID号作为数据库D中的ID。

解决方案

我通读了Facebook documentation,他们建议在客户端中嵌入Web浏览器,打开传递应用ID的特殊身份验证对话框,然后收听URI更改以从中获取访问令牌(这在上述文档的末尾进行了描述)。这正是我打算做的。我已经在客户端中嵌入了Web浏览器。它将在那里打开auth对话框,监听C ++代码中的URI更改并从URI获取访问令牌。然后客户端将访问令牌发送到服务器'S'。 'S'将向Facebook发出HTTP请求,传递访问令牌,Facebook将回复用户的个人数据。 'S'读取用户的FacebookID并将其放入用户数据库'D'(如果它还没有)。如果它已经存在,则为客户端提供敏感的用户特定数据。

替代解决方案

  1. 使用用户机器的本地浏览器打开Facebook对话框而不是嵌入式对话框(用户会觉得这样更加安全)。 Facebook会将用户的浏览器重定向到服务器'S',直接将访问令牌传递给它。在这种情况下,我必须制作'S'HTTP侦听器(在其上放置一个C ++ Web服务器)。这里的问题是Facebook允许重定向仅限于预定义的域(事先枚举),每次我想用不同的服务器'S'(经常),我将不得不在Facebook App控件中输入它面板。
  2. 使用当前我在开头提到的当前Web服务器。我将用户的本地浏览器重定向到该Web服务器,该服务器将触发服务器端PHP逻辑,以便将用户带到auth对话框,获取访问令牌并将其提供给S,这将从中获取FacebookID。
  3. 在解决方案1和2中,客户端还必须传递ClientID,以便服务器在尝试连接时能够识别它。

    我的问题

    与其他解决方案相比,您认为我的解决方案是否足够好且安全?将访问令牌从客户端传递到服务器是否安全?您是否看到我的解决方案存在其他潜在问题?

    提前致谢

1 个答案:

答案 0 :(得分:1)

对我来说,只要您使用https(您确实声明要)从C到S进行通信,这看起来就是一个很好的方法。

我建议您为要处理的每个S服务器制作不同的应用程序。例如,当我开发应用程序时,我有三个Facebook应用程序。一个用于我当地的包装盒。一个用于测试环境,一个用于生产。然后将应用程序ID存储在依赖于环境的配置文件中。

此外,不是使用Facebook用户ID的当前用户名字段,而是创建一个新用户ID。这样,现有的人仍然可以使用他们当前的凭据登录,并且采用Facebook登录的人可以轻松地登录。这也为您提供了一种快速方法,可以确定每个用户设置的凭据类型,以便更轻松地检查其凭据。