我最近的任务是创建一个定制的OAuth登录和注册流程.因此,我很好奇为OAuth请求生成和存储CSRF令牌的最佳方式是什么.我已经读过几篇关于这方面的文章,其中一篇来自Auth0.他们指出,CSRF令牌(随机字符串)应该放在对OAuth提供者的请求中,然后存储在本地.然后,当命中回调URL时,可以将状态为令牌的令牌与本地存储的令牌进行核对,以查看请求是否有效.
于是,我读了下面这篇来自Bright Sec的文章.它规定,
就像一般的会话令牌一样,CSRF令牌应该包含显著的熵,并且具有很强的不可预测性.
您可以通过使用加密强度伪随机数生成器(PRNG)来实现这一点,该生成器带有创建时的时间戳和静态秘密.
这意味着它们应该比Auth0文章中的随机字符串多一点.因此,像UUID这样的东西(这是我最初的 idea )可能并不真正符合良好的CSRF令牌的标准.
另外,我看到的这些文章大多是关于提交表格的.
So my question is what is the best way to create a csrf token in nodejs and where should I store it locally when authenticating to providers like Google and Facebook?个
My current understanding of what should happen.个
- 用户启动身份验证请求,此时您将创建一个CSRF令牌(仍然不确定执行此操作的最佳方法),并将其保存到本地(可能保存到会话中?).
- 将此令牌发送到状态参数中的OAuth提供程序
- 当OAuth提供程序响应您的回调url时,它们将在状态参数中将令牌发送回您,您应该比较2以确保请求是可信的.
有针对NodeJS的CRSF库.主要是Express中间件,但我不太确定这是否适用于OAuth请求.我一直试图梳理Passportjs和Next-auth,看看他们的方法是什么,但我认为这让我更困惑.Next Auth似乎将CSRF令牌作为Cookie存储在浏览器中,如下图所示:
因此,我只能假设CSRF令牌基本上只是为了确保如果有人拦截来自OAuth提供程序的请求返回到原始回调URL,他们不能从他们的浏览器使用它.因此,csrf令牌只是为了确保命中回调URL的请求是从它启动的同一个浏览器发起的.对,是这样?
无论如何,如果有任何关于如何创建令牌以及我应该将其存储在哪里的帮助,我将不胜感激.