【发布时间】:2013-09-30 17:32:38
【问题描述】:
我目前正在使用 2.0 实施 OAuth 身份验证 3 腿策略。我遇到了一个问题:
使用 Oauth 登录时记住客户端会话的最佳方式是什么。
目前我正在做的是在客户端上设置一个与我在服务器上的会话 ID 匹配的 cookie。这当然等同于普通的基于 cookie 会话的登录。然后在会话中,我会跟踪我在使用 Auth Code 时获得的访问令牌并将其交换为访问令牌。
如您所见,客户端和服务器之间的状态通过 cookie/会话 ID 保持同步,而访问令牌仅保存在服务器中并与会话 ID 相关。
但是我了解到这是不安全的,并且 OAuth 应该是无状态(restful)样式,因此不需要 cookie,尤其是当客户端是机器客户端而不是浏览器客户端时。一些资源提到客户端应该存储所有必要的凭据,以便验证对应用程序的任何请求。这是否意味着我应该将访问令牌存储在浏览器的标头中?来自重定向的身份验证代码呢,是否也应该存储在浏览器的标题中? (并且这些代码/令牌是否应该在浏览器的标头上加密/签名)(您将如何使用 PHP 来做到这一点?)
像这样的资源:@987654321@ 说客户端富 javascript 应用程序可以跟踪访问令牌并在每个 XHR 请求中传递它?但当然不是每个客户端都是 javascript 应用程序,例如机器客户端。
【问题讨论】:
-
tbh,当相关服务强制您使用临时令牌时,我从来不理解这种关于需要无状态的废话。这个令牌强制你有一个状态,因此无论如何都会使这个要求过时,我错了吗?
-
无状态意味着服务器不会一直跟踪客户端的状态。所以客户端令牌只是对请求进行身份验证,但服务器没有在数据库中跟踪它。数据库中基本上没有临时令牌。客户端应该跟踪所有状态,例如购物车将在客户端完成......等等。
-
好的,tnx。这也意味着我们不会为后续对经过身份验证的服务的请求获取临时令牌/密码,对吧?但我认为我们正在偏离这个问题。 ;)
-
是的,我正在考虑这个问题。可能是客户端是从经过身份验证的服务获取令牌的人,并且也是存储令牌的客户端。如果服务器需要令牌,客户端通过标头将令牌传递给服务器,但服务器从不存储令牌,它只是在每次请求时不断请求令牌。这就是这个问题的症结所在,如何对身份验证代码执行此操作,以及这样做是否是个好主意。
标签: php session authentication cookies oauth