我有一个桌面客户端应用程序'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和2中,客户端还必须传递ClientID,以便服务器在尝试连接时能够识别它。
与其他解决方案相比,您认为我的解决方案是否足够好且安全?将访问令牌从客户端传递到服务器是否安全?您是否看到我的解决方案存在其他潜在问题?
提前致谢
答案 0 :(得分:1)
对我来说,只要您使用https(您确实声明要)从C到S进行通信,这看起来就是一个很好的方法。
我建议您为要处理的每个S服务器制作不同的应用程序。例如,当我开发应用程序时,我有三个Facebook应用程序。一个用于我当地的包装盒。一个用于测试环境,一个用于生产。然后将应用程序ID存储在依赖于环境的配置文件中。
此外,不是使用Facebook用户ID的当前用户名字段,而是创建一个新用户ID。这样,现有的人仍然可以使用他们当前的凭据登录,并且采用Facebook登录的人可以轻松地登录。这也为您提供了一种快速方法,可以确定每个用户设置的凭据类型,以便更轻松地检查其凭据。