我们有一个网站,在这个网站上登录和验证自己的唯一方法是使用Facebook(这不是我的选择)。当你第一次登录Facebook时,会自动为你创建一个帐户。
我们现在想为我们的网站创建一个iPhone应用程序,也为其他人使用我们的服务创建一个公共API。
这个问题是关于如何从应用程序/API与我们的网站进行身份验证,分为两部分:
我已经阅读并研究了很多关于REST API认证的标准方法。我们不能在HTTPS上使用基本身份验证这样的方法,因为没有这样的用户凭据。类似的情况似乎只适用于使用API验证应用程序。
目前,我认为最好的方法是你在我们的应用编程接口上找到一个 /authorize的endpoint,它重定向到脸书OAuth,然后重定向回网站,并提供一个“令牌”,应用编程接口的用户可以使用它来验证后续请求。
我理解(我认为)如何验证使用我们API的第三方应用程序,使用API(公钥)和密钥(私钥)。然而,当涉及到对使用该应用的用户进行身份验证时,当我们必须对用户进行身份验证的唯一方法是Facebook时,我对如何进行该操作感到相当困惑。
我觉得我错过了一些非常明显的东西,或者我不完全理解公共REST API应该如何工作,所以任何建议和帮助都将不胜感激。
我试图回答同样的问题,最近我读了很多书。。。
我不会有“答案”,但事情对我来说越来越清楚了。你提到的文章里的评论你看了吗?我发现它们非常有趣和有帮助。
因此,鉴于自第一篇文章撰写以来情况的发展,我认为我将做以下几点:
>
使用OAuth2:
>
当认证请求来自我自己的应用程序/网站时,请使用上述文章回复中描述的“技巧”(或其变体)。
在我的例子中,我有两种类型的用户:那些具有经典登录/密码凭据的用户和那些已经注册了脸谱网连接的用户。
所以我会提供一个带有“用脸谱网登录”按钮的常规登录表单。如果用户用他的“经典”凭据登录,我会用一个grant_type=密码
将这些凭据发送到我的OAuth2终结点。
如果他选择通过脸书登录,我认为这将是一个两步过程:
请注意,我仍在大量研究这些东西,所以这可能不是一个完美的答案。。。甚至可能不是正确的!但我认为这将是一个很好的起点。使用“扩展授权”进行Facebook认证的想法可能需要注册才能正常工作?我不太确定。
无论如何,我希望我能帮你一点忙,至少它能开始讨论,找到这个问题的最佳解决方案:)
更新
Facebook登录并不像评论中指出的那样是一种解决方案:任何人都可以发送任意用户ID,并以此用户身份登录API。
这样做怎么样:
看起来好点了?
这是我使用JWTs(JSON Web令牌)的实现,基本上类似于Chris的更新答案。我使用过Facebook JS SDK和JWT。
这是我的实现。
>
客户端:通过调用/verify access token
endpoint从我的API请求JWT。
MyAPI:接收访问令牌,通过调用Facebook API的endpoint来验证它。
MyAPI:如果访问令牌有效,则从数据库中查找用户,如果存在,则登录该用户。创建一个JWT,将必填字段作为有效负载,设置到期日,使用密钥签名,然后发送回客户端。
客户端:将JWT存储在本地存储中。
客户端:发送令牌(步骤5中的JWT)以及下一个API调用的请求。
MyAPI:使用密钥验证令牌,如果令牌有效,则将令牌交换为新的令牌,并将其与API响应一起发送回客户端。(在此之后,没有外部API调用来验证令牌)[如果令牌无效/过期,请客户端再次验证,并从1开始重复]
客户端将存储的令牌替换为新令牌,并将其用于下一个API调用。一旦满足令牌到期条件,令牌将到期,从而取消对API的访问。
每个代币只使用一次。
阅读更多关于安全和JWT的答案
JWT有多安全
如果你能破解JWT,它们的安全性如何?
JSON Web令牌(JWT)作为用户标识和身份验证令牌
我也一直在认真思考这个问题。我还不完全清楚,但这是我想走的路线。我正在创建一个REST API,一个仅限我的用户使用Facebook connect进行身份验证的API。
在客户机上:
在API上(对于每个需要用户身份验证的方法):
我还没有测试这个。听起来怎么样?
我只在登录时使用上述交换一次。一旦我确定了哪个用户正在登录,我就创建了自己的访问令牌,该令牌将从此点开始使用。所以新的流程看起来像这样。。。
在客户机上:
在API上
我试图建立一个认证系统与Laravel 4与Facebook登录。我正在使用Laravel 4的madewith love/laravel-oAuth2包。 当然,当用户登录Facebook时,没有密码可以添加到我的数据库中。但是,我正在尝试检查数据库中是否已经有用户id,以确定是否应该创建一个新实体,或者只是登录当前实体。我想使用Auth命令来实现这一点。我有一张叫做“粉丝”的桌子。 这就是我正
我正在尝试使用urllib3连接到网页。代码如下所示。 如果我们假设url是需要使用用户名和密码进行身份验证的某个网页,那么我是否使用正确的代码进行身份验证? 我使用urllib2做这件事很舒服,但使用urllib3做不到同样的事情。 非常感谢
jwt不应该仅仅用于认证用户吗?我读到过可以在里面存储非敏感的东西,比如用户ID。将权限级别之类的东西存储在令牌中可以吗?这样我可以避免数据库调用。
在本章中,我们将使用Firebase Facebook身份验证对用户进行身份验证。 第1步 - 启用Facebook身份验证 我们需要打开Firebase信息中心,然后在侧边菜单中点击Auth 。 接下来,我们需要在标签栏中选择SIGN-IN-METHOD 。 我们将启用Facebook身份验证并保持打开状态,因为我们需要在完成第2步时添加App ID和App Secret 。 第2步 - 创建F
我试图建立一个新的服务器,作为网关(使用sping-Cloud-网关作为基础),我需要能够在实际转发任何后续请求之前通过远程LDAP服务器验证用户。我将如何实现这个(包,配置等)?
我正在尝试使用connect将passport集成到我的nodejs服务器中,但似乎无法正确完成。所有的指南/示例都使用expressJS,所以我尽了最大努力重新格式化代码以使用我的代码,但我似乎无法让它正常工作。相关部分写在下面。有人对可能出现的问题有什么建议吗?护照authenticate()似乎从未被调用(至少facebook身份验证回调中的console.log消息从未打印)。我目前没有将