我将django-allauth和django-rest-auth用于 iOS 移动应用程序后端。我是 Django Rest Framework 的新手,尤其是提到的那些。这些非常适合基于访问令牌的授权。如您所知,用户成功登录后何时会收到访问令牌,而注销时访问令牌会被删除。但是,如果有多个设备,我假设用户将从所有设备中注销。有没有办法为每个设备创建访问令牌并使用这些访问令牌进行授权?
1 回答
当您处理您自己的 API、您的客户端和第三方 API 之间的身份验证时,您永远不想将第三方应用程序的令牌公开给您的客户端。我过去在 Stack Overflow 上对此进行了介绍,python-social-auth
我建议您也查看一下django-allauth
。
您说过您正在使用django-rest-auth
,它为每个用户维护一个令牌,该令牌在多个客户端之间共享。这与 Django REST Framework 提供的非常相似TokenAuthentication
,并且具有许多相同的缺点。由于所有客户端都为用户共享相同的身份验证令牌,因此如果出于任何原因必须撤销令牌,所有客户端都会受到影响。更糟糕的是,django-rest-auth
允许用户显式“注销”,这会立即撤销所有人的令牌。如果只有一两个客户端将使用您的 API,这很有效,并且他们可以处理神秘消失的令牌,但它不适用于任何更大的. 它也不支持用户使用多个令牌,这正是您要寻找的。
我通常建议 API使用基于令牌的身份验证,如 OAuth,并且django-oauth-toolkit
往往是 Django REST Framework 的推荐身份验证。这将允许您从本质上代理第三方和您的客户之间的请求,同时为客户保留唯一的用户令牌。由于令牌对客户端是唯一的,因此您无需担心令牌被撤销或过期会影响另一个客户端,因为令牌将彼此独立。
许多“大牌”都使用 OAuth,例如Stack Exchange、Google和Facebook。虽然它不直接支持“注销”的概念,但通常建议您为应用程序的用户创建自己的页面以撤销应用程序的令牌,这样他们就可以控制谁可以和不能访问 API代表他们。