【问题标题】:Suggestion on Spring OAuth2 architecture关于 Spring OAuth2 架构的建议
【发布时间】:2017-01-20 05:11:50
【问题描述】:

我正在尝试构建 spring-angular2(spring 新手)应用程序,我选择 OAuth2 作为安全模型。我的新应用程序有 3 个部分。身份验证服务器、后端服务器和前端(角度 2)。目前我使用 OAuth2 仅用于身份验证目的

根据我目前的设计,我的服务器(业务层)将与身份验证服务器通信以进行身份​​验证(基于授权码)并将接收 OAuth2 令牌(短期访问令牌和长期刷新令牌)。我的目的是在需要时使用此刷新令牌生成访问令牌,直到其到期,然后重定向到身份验证服务器进行登录。所有令牌管理都将在服务器上处理,前端对此一无所知。

现在,当我运行我的应用程序时,使用这种设计,angular2 应用程序将首先加载,它会尝试访问受保护的 url(作为身份验证检查)。如果服务器返回 401 错误,Angular 将强制网页重定向到身份验证服务器进行登录。后端服务器使用会话来处理安全性(默认 oauth2client 设置)。这里的问题是,当会话由于空闲而到期(默认 30 分钟)时,我将无法使用刷新令牌(有效期 10 天),并且 Spring Security 会将网页重定向到身份验证服务器进行登录。

我认为将会话有效期延长至 10 天不是一个好主意。所以我打算避免设计中的会话,将令牌存储在用户模型(db)中,并向浏览器发送一些唯一的 id,用于访问这个令牌并使用过滤器创建身份验证对象。 Angular 会将此 id 存储在 localstorage 中并在每个请求标头中发送。

如果我需要为此问题添加更多输入,请告诉我。

我需要你的建议

1) 这个架构好不好?你有什么改进的建议吗?

2) 有什么方法可以处理刷新令牌而不用担心会话空闲超时? (正如我之前提到的,我是 Spring 世界的新手。所以我可能会在这里遗漏一些小东西)

3) 如果我不使用会话,你建议我应该如何将唯一 id 传达给浏览器(angular2)?我也想避免使用cookies。在此设置中,url 查询字符串是否是唯一将此唯一值传递给 angular 应用程序的方法?

【问题讨论】:

    标签: spring authentication spring-security-oauth2 oauth2


    【解决方案1】:

    与 Spring 无关,但对于 OAuth 应用程序,不需要服务器端,因为访问令牌是不记名令牌。但是在您的情况下,我想您可以将刷新令牌限制为 25 分钟,以便在您的会话空闲之前获得一个新令牌,但在这里(如果我理解正确的话)问题将是您的会话仍然会在服务器上超时并且用户仍将被重定向以进行身份​​验证。

    从逻辑上讲,您的资源服务器应该简单地具有一个过滤器,该过滤器可以自己验证令牌或与 Authz 服务器一起验证令牌并授予访问权限。服务器端没有会话管理。另外,请考虑注销场景。

    【讨论】:

    • 我计划将来开发其他使用相同身份验证服务器的应用程序。我使用 Auth 服务器进行初始身份验证和访问令牌更新。
    • 还有短暂的刷新令牌意味着,活跃用户将经常被重定向到登录屏幕。我试图避免这种情况。
    • 这就是 OAuth2 的原因,不需要服务器端会话。 OAuth 令牌代表 Session,就像 cookie 基础 SME。
    • 这是我的第三个问题。您对将此令牌传达给客户端脚本有何建议?由于与 oauth2 相关的通信是在服务器上处理的,因此我的客户端脚本在 Auth 过程中无法获取任何令牌。除了cookies还有什么办法吗?
    • 您的客户端脚本在哪里?从上面的问题有三方,我猜 Angular JS 必须在浏览器中生成 UI/代码,从逻辑上讲,UI/代码应该总是与 Angular JS 服务器对话,而后者又应该通过后端调用与 Authz 服务器和资源服务器对话,除了第一个当最终用户代表他授权客户端应用程序访问资源服务器并且客户端使用刷新令牌进行访问时调用。因此,据我了解,浏览器中不需要 cookie。访问令牌也保留在 Angular JS 服务器中,而不是在浏览器中
    猜你喜欢
    • 2019-03-22
    • 1970-01-01
    • 2016-07-10
    • 2019-06-09
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2011-08-05
    相关资源
    最近更新 更多