2016-07-26 76 views
1

我刚刚将Json Web令牌实现到了我的API,但我不明白如何验证创建令牌的用户是否是发出请求的用户。Json Web令牌+用户认证

例如,我有/用户/登录端点,并且我收到了用于登录的用户和密码。然后我用里面的用户数据创建一个json Web令牌,并返回它。这是我的问题,我如何知道创建该令牌的用户是发出请求的用户?

我发现了几种方法来验证这一点,例如保存用户的用户代理+ IP,只接受对该令牌的请求,如果用户代理+ IP是xxx,但我不太确定那是最好的办法。

我希望你能帮助我一些提示,

感谢所有

+0

正如@pedrofb所言,服务器发布JWT,而不是客户端。客户只是在每个请求发送它。 –

+0

嗨@JIFT,你检查了答案吗?请记住,如果其中一个答案适合您的问题,您可以将其标记为已接受。这是可选的 – pedrofb

回答

0

你不能像使用的OAuth2标准,让大男孩处理安全为你的原因吗?滚动自己的安全性通常很难得到正确的结果,几乎所有的主要参与者都提供免费的OATH支持。这就是说,我会犹豫是否会带领你走上一条糟糕的道路,然而,如果你必须推出自己的安全措施,请确保你完全阅读OWASP提供的所有内容。他们提供非常详细的威胁分析,并提供在您的旅程中无价的建议。

OWASP Threat Analysis

EDIT 1

良好的重量轻,易于实现标准是OpenID其中作为其横幅解释是,

上的OAuth 2.0的顶部一个简单的身份层

请看这里为它是如何工作的一个非常详细的解释: OpenID-Wiki

+0

嗨约瑟夫,是的这个星期我实现了这个OAUTH库https://bshaffer.github.io/oauth2-server-php-docs/,但它使我创建了很多表,我真的不明白为什么,因为这是一个网站和应用程序的API,我认为我不需要所有这些。但可能是我错了。如果你可以告诉流程你将使用OAUTH来验证登录,那将是非常好的。 – JIFT

+0

我编辑了建议OpenID的答案。而且,这么多表的原因是你正在安装一个OAUTH2服务器。除非你绝对想要控制会员资格,否则你不需要。相反,您希望向知名供应商注册您的应用并使用他们的服务(让他们排序头痛)。有很多资源,但我会从OpenID程序开始,然后从那里开始工作。 –

+0

哇,它看起来非常棒,但它的收入。我正在寻找一个不太适合自己发展的替代方案,因为这是我自己的职业,而不是我为之工作的公司。 – JIFT

1

我怎么知道这创建令牌用户,是发出请求的一个?

由于JWT包含用户标识并已签名,因此将检测到任何对内容的更改。令牌的拥有是真实性证明

发放和认证具有JWT或多或少像这样

发行新JWT

  1. 用户执行和的方法,验证使用其凭证

  2. 服务器验证凭证,生成JWT有效载荷,包括用户数据和一些字段,如过期ti我或发行人,并用服务器私钥对令牌进行签名

  3. 客户端接收令牌并将其存储在安全存储中。

认证

  1. 用户发送到服务器的请求。该请求包括JWT,通常在标题中或作为url参数

  2. 服务器使用密钥验证签名,并提取用户ID以了解请求者。如果签名无效,拒绝请求

+0

感谢您的答案@pedrofb,那就是我实际使用的流程,但是例如,您会推荐什么“安全存储”,如会话变量或Cookie?我想以相同的方式添加额外的安全性,以验证来自该令牌的用户ID是发出请求的用户ID。 – JIFT

+0

您可以使用localStorage,sessionStorage和cookie。看看这里的比较https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage。 localStorage容易受到XSS攻击,cookie容易受到CSRF攻击,因此您需要向JWT添加CSRF令牌。如果您不需要阅读客户端的JWT内容,也可以使用HttpOnly保护Cookie。根据需要自己决定:) – pedrofb

+0

userId位于JWT'sub'字段内。如果您希望JWT不能用于完成完整身份验证,则必须添加其他安全措施。例如,需要先前发布的JWT和CSRF安全令牌。另一种选择是使用在客户端生成的加密密钥对,并要求客户端在请求的有效负载上签名。服务器将使用公钥验证签名(链接到用户帐户)。但是这个选项比较复杂 – pedrofb