如何在JS应用程序和同一域上托管的OAuth2.0服务器之间进行安全通信?

时间:2015-02-01 15:34:42

标签: javascript facebook authentication oauth-2.0

我知道在JS应用程序(简单地说就是'app')和OAuth2.0服务器(假设只是'服务器')之间保证连接的问题是一个古老的问题。


但是,我找不到很多关于应用程序和服务器由同一实体编码并存储在同一地点的特殊情况的信息(即相同的域,或至少,同一域的两个子域。)

首先,就OAuth授权类型而言,我认为正确的是资源所有者密码凭据授权,因为服务器和应用程序具有相同的作者。这里的问题是客户端ID和客户端密钥可供客户端中的用户使用。这可以通过在服务器端开发代理或使用短生命令牌和禁用CORS(如果我理解正确)来处理。 当服务器和应用程序具有相同的作者时,我们是否可以利用任何其他属性?


我的第二个问题涉及可选择使用Facebook登录身份验证(或任何知名的应用OAuth登录系统:Google,Twitter等)。

理想情况下,我希望用户使用以下任一种方式登录:

  • 与我的应用相关的凭据(如果他们在不使用FB登录选项的情况下注册)
  • Facebook凭据(如果他们使用FB登录选项注册)

第一种登录方法是经典方法:登录后,将用户凭证连同客户端ID和客户端密码一起发送给服务器,我们返回一个访问令牌,一切正常。

我必须承认我对第二种方法有点迷失:登录后,用户Facebook凭据被发送到Facebook服务器,后者以访问令牌响应,我的应用程序可以访问我的用户Facebook信息(例如电子邮件)地址和UID)。但我不知道如何处理这些FB信息,特别是我应该发送到我自己的OAuth服务器,以便:

  • 用户已连接到我的服务器
  • 连接安全(例如,没有人可以通过仅获取她的Facebook UID来冒充用户。)

换句话说,应该有一些与Facebook相关的秘密信息发送到我的服务器,但我无法确定是什么。

1 个答案:

答案 0 :(得分:0)

我找到了第二个问题的答案,所以我在这里分享一下:

应该传递给服务器的是Facebook访问令牌,以便服务器可以:

  1. 使用Facebook PHP SDK和给定令牌提出请求
  2. 检索用户数据(例如Facebook UID)
  3. 将其与您的网站用户数据库(应该有用户FB UID)匹配
  4. 如果匹配,实际上会连接用户
  5. 步骤1和2.可以使用FB PHP SDK的助手类FacebookJavascriptLoginHelper很好地完成。在这种情况下,访问令牌由Facebook Javascript SDK存储到由FacebookJavascriptLoginHelper在服务器端读取的cookie中。