我们有一个网站,登录和验证自己的网站的唯一方法是使用Facebook(这不是我的选择).第一次使用Facebook登录时,会自动为您创建一个帐户.
我们现在想为我们的网站创建一个iPhone应用程序,也为其他人创建一个公共API来使用我们的服务.
这个问题是关于如何通过app/API对我们的网站进行身份验证,并分为两部分:
从API到仅使用Facebook OAuth作为身份验证方法的网站处理REST身份验证的正确方法是什么?
我已经阅读并研究了很多关于REST API的标准身份验证方法.我们不能通过HTTPS使用Basic Auth等方法,因为没有用户凭证.像这样的东西似乎只是用于使用API验证应用程序.
目前,我认为最好的方法是在API上点击/授权终点,重定向到Facebook OAuth,然后重定向回站点并提供API的用户可以用来验证后续的"令牌"要求.
对于我们创建的官方应用程序,我们不一定需要以相同的方式使用公共API.那么与我们的网站交流并对用户进行身份验证的最佳方式是什么?
我理解(我认为)如何使用API(公共)密钥和秘密(私有)密钥验证使用我们的API的第三方应用程序.但是,当涉及到对正在使用该应用程序的用户进行身份验证时,我对如何进行此操作感到困惑,因为我们必须对用户进行身份验证的唯一方法是Facebook.
我觉得我错过了一些非常明显的东西,或者没有完全理解公共REST API应该如何工作,所以任何建议和帮助将不胜感激.
我正在尝试设计REST API以支持各种移动客户端(iOS和Android应用程序).这些应用程序将允许用户使用Facebook登录以及我们自己的电子邮件身份验 您可以参考下图来了解我的设计

授权分为两级:
第一个是使用OAuth2的"客户端(或应用程序)授权".因此,当用户在移动设备上安装我们的应用程序并启动应用程序时,首先,应用程序进行"客户端(应用程序)授权",如上图所示(第1张图像).并且服务器向access_token客户端发回长期存储以用于所有后续调用.我的问题是:
Q1)可以看到客户端发送client_key和client_secret,我将它们存储在client_info表中.这个秘密应该是纯文本还是应该是可解密的格式?如果我加密它,我仍然需要在我的系统中的某处保留加密密钥.那它将如何使其安全?同样在每次通话中,解密都是一种开销.
Q2)是否可以access_token在redis中以纯文本格式缓存客户端并首先使用该缓存?
Q3)为了更安全,我要求客户发送appsecret_proof以确保access_token,他们发送的只属于此客户端.它使用与Facebook相同的概念https://developers.facebook.com/docs/graph-api/securing-requests#appsecret_proof.它是hash_hmac('sha256', access_token, client_secret)
Q4)我们将只拥有自己的2个移动应用程序(每个用于iOS和Android),并且不提供第三方使用我们的API来开发其他应用程序.这意味着,client_info对于每种类型的应用,我们的表只有两行一个.所以可以,在应用程序代码中,我们保留client_key并client_secret硬编码?如果是,那么将来当我们必须使新秘密失效并使用新秘密时,我们将如何取代这些信息呢?
Q5)因为它是我们自己的应用程序几年,所以会有多个access_token将被创建针对相同client_key和client_secret.为了保存所有这些,在redis中存储client_key键和array of all access_tokens值是一个好主意.将来,当我们将API打开给第三方时,这个redis存储设计仍然可以扩展吗?
=================
稍后,用户决定对我的应用程序执行某些操作,因为我们需要用户登录他的帐户.对于该用户,请单击"facebook login".我的应用程序facebook access_token从Facebook 获取和fb用户的id并将这些信息传递给API服务器(如第二张图所示).API服务器获取该令牌并调用facebook API来验证它access_token.一旦令牌被验证,服务器使用该用户相关的一些元数据与FB访问令牌一起产生我们自己user_access_token,让我们说utoken.并将其传递utoken回客户端,以便在每个后续用户特定的API调用中传回.我的问题是:
Q1)可以将其保存utoken在数据库,user_token表中.这utoken应该是纯文本还是应该是可解密的格式?如果我加密它,我仍然需要在我的系统中的某处保留加密密钥.那它将如何使其安全?同样在每次通话中,解密都是一种开销.
Q2)在每个用户特定的API调用中,我是否应该每次调用facebook进行检查facebook access_token仍然有效?我相信我不应该,因为这对我没有任何意义.请注意,Facebook仅用于"facebook登录".
Q3)我应该加密生成utoken什么信息?我想有一个散列或用户的关联数组email,user id,role …
我正在开发一个应用程序,我必须使用facebook登录从我的后端服务器访问数据.我搜索了这个并得到了:
我已成功将我的应用程序与Facebook连接,即现在用户可以从我的应用程序登录到Facebook.但我现在不知道如何获取用户的访问令牌以及如何在服务器上验证此访问令牌.
你能为我提供一些示例代码吗?请帮助我,我很长时间陷入其中.