【问题标题】:What's the best practice of using JWT token for authentication? [closed]使用 JWT 令牌进行身份验证的最佳实践是什么? [关闭]
【发布时间】:2018-08-31 04:24:10
【问题描述】:

目前,我的 Spring Boot 项目由少量 REST 服务组成;资源服务、认证服务等。

每个服务的名称都是自我描述的,但这里是角色,

  • 资源服务:负责管理用户、交易、供应商等所有资源。
  • 身份验证服务器:负责根据“密码”授权类型请求创建 JWT 访问令牌

框架使用公钥为我进行 JWT 令牌验证。目前,如果请求的 JWT 令牌有效,资源服务器会处理任何请求。但是,我不确定最佳做法是什么以及如何验证请求者拥有所请求的资源。

例如,如果用户 Jacob 想要检索 Paul 使用有效 JWT 创建的交易。我的应用程序需要验证请求者,Jacob 对 Paul 的交易没有所有权。

提前致谢!

【问题讨论】:

    标签: authentication spring-boot oauth-2.0 jwt spring-security-oauth2


    【解决方案1】:

    我想说,最好的做法是让您的访问令牌保持短暂的生命周期,并将它们放在远离用户代理的服务器端,并始终在线上使用 SSL。

    JWT 访问令牌是不记名令牌。顾名思义,谁拥有它们,谁就可以使用它们。

    将访问令牌想象成一个五元(5 英镑),将您的事务资源服务器想象成一个酒保。

    现在,假设您将 5 英镑丢在地板上。

    今天是我的幸运日!我拿起它,去酒吧买一品脱。

    酒保会问我 5 英镑的钞票是谁的吗?

    没有。

    就像您的服务器不在乎是 Jacob 还是 Paul 拥有令牌一样。

    【讨论】:

    • 那么您的意思是,只要令牌有效,那么用户就可以执行任何操作?嗯……我至少可以根据角色和范围来区分权限,对吗?
    • 是的,范围、主题/upn、受众、发行者和应用 ID 等...可能在令牌中。但是任何人仍然可以使用该令牌。因此,如果它的范围是允许对 Paul 最近的交易进行读取访问。 Jacob 可以出示代币并访问 Paul 最近的交易。
    • 这是有道理的。但我可以再问一个问题吗?如果 API 是面向第三方 API 的 OpenAPI,则使用 JWT 令牌可能会导致问题。就像 AppCompany 1 使用他们的访问令牌来查询 AppCompany 2 的数据。如何预防?
    • 对 OpenAPI 了解不多,但 jwt 访问令牌中的受众 aud 值可用于将令牌的使用限制为特定资源 API。
    • 我可以使用受众声明来验证请求者是否拥有所请求资源的所有权?规范说“如果处理该声明的主体在此声明存在时未将其自身标识为“aud”声明中的值,则必须拒绝 JWT。因此,断言 aud 值与请求的资源标识符匹配。
    【解决方案2】:

    我认为 JWT 令牌背后的想法是,您无法从令牌本身确定它来自谁,您只需检查令牌是否有效并检查时间戳。

    【讨论】:

    • 在我的 JWT 令牌中,我确实有 'user_name'、'authorities' 和 'scope' 字段。我可以使用它们进行所有权验证吗?就像...有一个过滤器拦截请求,提取访问令牌,解密它然后匹配这三个字段以验证所有权。
    猜你喜欢
    • 2020-06-14
    • 2010-12-10
    • 2017-07-05
    • 2017-06-26
    • 1970-01-01
    • 2018-01-05
    • 2015-02-24
    • 2018-08-29
    • 1970-01-01
    相关资源
    最近更新 更多