我想允许使用加密密码和基于会话的身份验证的web应用程序的用户能够授予我们的技术支持团队一段时间访问其帐户的权限,并可以选择手动撤销访问权限。有没有一种安全的方法来解决这个问题?
我正在使用LAMP堆栈。
理想情况下,可以手动授予访问权限(例如当用户与我们通话时)或自动授予访问权限(例如当用户通过我们的应用程序给我们发电子邮件或在我们的支持论坛上发帖时)。
我能想到的一种方法是这样的:
- 用户点击应用程序中的一个按钮,允许技术支持访问他们的帐户。
- 浏览器将向服务器发送请求,服务器将在我们的支持数据库中存储用户的会话标识符,CSRF令牌等。
- 支持数据库将让支持技术人员找到他们正在交谈的客户,并随后使用相同的会话标识符等,登录到用户的帐户。 手动撤销访问将从支持数据库中删除会话标识符。
但是,它必然将技术支持限制在会话长度上,这可能不够长,特别是在电子邮件支持的情况下。
是否有更好或更标准的方法来处理这个问题?
EDIT 1:我可以做一些事情,比如生成一个新的令牌,允许技术人员通过后门登录,但我宁愿尽可能避免后门。
我想另一种可能性是给一个大开放的后门,只能通过SSH隧道访问服务器。仍然是一个后门,但至少非常限制谁可以访问它。
我想允许用户[…],并可选择手动撤销访问权限。
您正在描述委托授权。OAuth协议正是为此而设计的,并且更加安全。
在OAuth 2.0术语中,最终用户是资源所有者,技术支持代表用来访问用户帐户的系统称为客户端。OAuth为资源所有者提供了一种方法,允许客户端访问他在资源服务器上的资源。授权完成后,客户端收到一个访问令牌。
与客户端访问令牌关联的访问权限具有作用域,它定义了客户端对资源所有者(最终用户)资源的访问授权程度。这比共享会话ID的解决方案更安全,因为(1)各方之间没有共享秘密,(2)客户端访问不与用户的会话绑定,(3)客户端的访问范围可以被限制,因此他只能部分访问。访问令牌可以随时撤销;可能由资源所有者或过期时间决定。
您应该阅读OAuth 2.0规范,以了解如何授予授权以及如何颁发和使用访问令牌的技术细节。