我们有一个身份服务器,它为我们所有的各种应用程序实现OAuth2协议,这样我们的用户的单个身份就可以在这些应用程序之间共享。我很难思考如何将我的应用程序安全地连接到服务器。
以下是我们现在拥有的堆栈组件:
- 一个单页javascript应用程序,可调用我们的API(app.mydomain.com)
- API是Django Rest Framework API(API.mydomain.com)
- 身份服务器(auth.mydomain.com)
以下是我的想法:
-
javascript应用程序使用用户在表单上输入的用户名和密码POST到
api.mydomain.com/login
,并在标题中传递该应用程序的clientId
,该应用程序在身份服务器上定义为注册应用程序。 -
api.mydomain.com/login
向auth.mydomain.com
发出请求,请求为用户授予密码,并传递clientId和clientSecret(假设在api方面,我们知道如何将clientId映射到其机密)。 -
如果用户名、密码、clientId和clientSecret都签出,
auth.mydomain.com
将使用访问令牌进行响应。身份服务器使用访问令牌、刷新令牌等进行响应。类似的东西
{
"access_token": "someRequestToken",
"refresh_token": "someRefreshToken",
"expires_in": 3600,
"token_type": "Bearer"
}
- 未来对
api.mydomain.com
的任何调用都将使用请求中提供的Bearer XXX
令牌进行-我们在API上的自定义身份验证模块可以读取令牌,并在每个请求中与身份服务器检查其有效性
我的问题是-我如何将其插入到SessionMiddleware和SessionAuthentication中,这样我们就不需要将每个请求的令牌提交给API,API也不需要与身份服务器检查每个请求的有效性?
谢谢你的想法。
如果您正在实现OAuth2,则令牌必须随每个请求一起传递。OAuth2的整个安全性取决于它。您还提到您正在使用REST。会话对REST来说是绝对不允许的。