我应该使用 oauth2 jwt 授权将啥存储到数据库中?

Posted

技术标签:

【中文标题】我应该使用 oauth2 jwt 授权将啥存储到数据库中?【英文标题】:What should I store into db with oauth2 jwt authorization?我应该使用 oauth2 jwt 授权将什么存储到数据库中? 【发布时间】:2015-06-01 03:48:15 【问题描述】:

我想使用 OAuth JWT 令牌进行授权。由于某些原因(osgi 容器),我无法使用 spring-oauth-security。

在 spring-oauth-security 的自述文件中,我找到了一个引用:

存储的 JSON Web 令牌 (JWT) 版本将有关授权的所有数据编码到令牌本身(因此根本没有后端存储,这是一个显着的优势)。

https://github.com/spring-projects/spring-security-oauth/blob/master/docs/oauth2.md

我绝对不明白“根本没有后端商店”。 jwt中有两种情况:

对称密钥或共享密钥 (HMAC);

验证者密钥是一个共享密钥,可通过 /token_key URL 获得。 问题 1:我应该为每个注册用户在服务器上存储共享密钥。为什么“根本没有后端存储”?

非对称密钥 (RS/ES);

/token_key 返回公钥(没有主体)。

问题 2:但为什么我们只为所有用户使用一个公钥?它无法为 rsa 中的同一个公钥生成多个私钥,不是吗? RSA 中只允许一对私钥 - 公钥。

我不明白流程以及为什么“根本没有后端存储”。

【问题讨论】:

【参考方案1】:

您不会为每个用户使用不同的密钥,而是为每个身份提供者使用不同的密钥。

身份提供者使用密钥对 JWT 进行签名,您无需后端查找即可为每个用户验证它。对于 JWT 验证,您只需要一个与身份提供者相关的密钥 - 即使您将其存储在某个数据库中,您也可以获取一次并缓存它。对于非对称密钥,OIDC 甚至定义了一个 URL 来获取用于签名的公钥。

密钥用于信任身份提供者,因此隐含地信任它提供的身份。

这是关于该主题的相当不错的文章: https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/

【讨论】:

每个身份提供者的秘密,你是对的!谢谢,我现在明白了。不错的文章,顺便说一句,我喜欢它。

以上是关于我应该使用 oauth2 jwt 授权将啥存储到数据库中?的主要内容,如果未能解决你的问题,请参考以下文章

OAuth2:JWT授权授予和客户端凭据授权与JWT客户端身份验证之间的区别是什么?

Spring oAuth2 with JWT 使用不同的授权和资源服务器

Spring Boot Security OAuth2 实现支持JWT令牌的授权服务器

使用 JWT 的 Oauth 2.0 授权

使用 JWT 令牌实现身份验证和授权

向 Google 进行身份验证时,从 Spring OAuth2 授权服务器发出 JWT 令牌