我的理解是OAuth2访问令牌不打算用作会话ID。
我有一个单页JavaScript应用程序(包装在Cordova应用程序中)。它使用OAuth2获得对某些Web服务的访问。但是我想在用户使用OAuth授权的同时开始会话,这样我就可以实现会话过期和注销。
在这种情况下,是否应该执行以下操作?
- 通过受会话保护的特定于应用的Web服务器对Web服务的代理请求
- 使用授权代码流(而不是隐式流),该流与Web服务器一起使用,并允许刷新令牌
- 将访问/刷新令牌存储在应用程序服务器上,并在将请求传递到Web服务时添加它们?
我在想这样的事情。这几乎是标准的授权码流程,但是引入了用于处理会话的步骤5-9。
- 应用程序在单独的窗口中加载OAuth授权URL
- 用户输入凭据
- 重定向URL调用应用程序服务器,并在其中发送身份验证代码
- 应用服务器将身份验证代码交换为访问/刷新令牌,并将其存储在数据库中
- 应用程序服务器启动会话,并作为响应返回会话ID作为JavaScript变量
- 应用使用跨窗口通信(例如postMessage)来检索会话ID,并将其存储在sessionStorage中
- 在发出Web服务请求时,应用程序将其发送到应用程序服务器而不是Web服务服务器,并传递会话ID
- 应用程序服务器验证会话ID,在数据库中查找访问令牌,然后将请求传递到Web服务服务器,添加访问令牌
- 如果访问令牌已过期,则应用程序服务器在数据库中查找刷新令牌,然后调用OAuth服务器以将其交换为新的访问令牌
我是否通过这样做引入了任何安全性问题,特别是在步骤5-6中切换会话ID的过程中?
进一步使事情复杂化:我想使用Touch ID重新进行身份验证。在这种情况下,我可能会返回另一个令牌以及会话ID,并将其存储在钥匙串中(由于这是Cordova应用程序,因此我可以这样做)。如果检索到它,则可以将其传递到应用程序服务器上的URL,这将启动一个新的会话,并使用刷新令牌来检索新的访问令牌。该URL不受会话的保护,因为在会话到期后它需要工作。如果有人对这种方法有想法,我将不胜感激。