Spring Security OAuth2 将 access_token 存储在 cookie 中
Posted
技术标签:
【中文标题】Spring Security OAuth2 将 access_token 存储在 cookie 中【英文标题】:Spring Security OAuth2 store access_token in cookie 【发布时间】:2019-06-03 00:48:08 【问题描述】:我使用Spring Security
+ Angular
。当我向/oauth/token
发出发布请求并获取令牌时:
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NDY5NDQwODYsInVzZXJfbmFtZSI6ImFkbWluIiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9BRE1JTiJdLCJqdGkiOiI4M2VhMTA1MC05NjczLTRlZGItOTlmMS0yNWIzOTQ1ODdjMmUiLCJjbGllbnRfaWQiOiJmcm9udGVuZCIsInNjb3BlIjpbInJlYWQiLCJ3cml0ZSJdfQ.i6v2G70eEgGUt_CdgctcTrGgz_RHs6OuEA8lGHOgVro",
"token_type": "bearer",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbInJlYWQiLCJ3cml0ZSJdLCJhdGkiOiI4M2VhMTA1MC05NjczLTRlZGItOTlmMS0yNWIzOTQ1ODdjMmUiLCJleHAiOjE1NDk1MzI0ODYsImF1dGhvcml0aWVzIjpbIlJPTEVfQURNSU4iXSwianRpIjoiNzQxMDA0NzUtODkxOC00YjM5LTk5NDMtNjAzMWIxMGVjNGQ3IiwiY2xpZW50X2lkIjoiZnJvbnRlbmQifQ.3QOdAL10lQsPSvsFfgyf02gvAanyJ-R1BX_wtF1APB0",
"expires_in": 3599,
"scope": "read write",
"jti": "83ea1050-9673-4edb-99f1-25b394587c2e"
如何在Spring Security
端指定cookie 的安装并在那里保存令牌?还是我必须像这样在Angular
一侧这样做:
Cookie.set("access_token", token.access_token, expireDate);
什么是正确的做法?在我看来,将令牌存储在 cookie 中是一个正确且安全的决定。
【问题讨论】:
【参考方案1】:访问令牌适用于执行休息调用的用户代理。他们可以安全地存储访问令牌(大多数在安全服务器的内存中进行),并在每次调用时将该令牌传递给服务器。
话虽如此,您的应用程序不应获取该令牌并以 cookie 的形式将其发送到浏览器。
如果您使用的是implicit_grant,那么您的应用程序已被视为安全性较低,因为获取令牌不需要客户端凭据。
在这种情况下,我建议将其保存在应用程序的内存中。如果应用程序必须存储它(以防止重新加载等),请考虑使用local session storage
最坏的情况local storage 将在浏览器关闭后继续存在。
但我认为您在这里不需要 cookie。因为令牌是使用带有 bearer prefix
的授权标头传递给 API 的
Authorization: Bearer AbCdEf123456
希望对你有帮助
【讨论】:
感谢您的回复。但我仍然不明白使用Angular
前端时存储访问令牌的最佳做法。
您将其存储在您的 javascript 应用程序的内存中。 var token = ...;
然后在每个请求中传递它。我确信一些 javascript 框架已经为你做到了。
不要将令牌存储在本地存储中,这是一个安全问题。
你能检查一下my question related to this subject吗?以上是关于Spring Security OAuth2 将 access_token 存储在 cookie 中的主要内容,如果未能解决你的问题,请参考以下文章
如何将 spring security 与 rest oauth2 服务和 spring social 集成?
Spring Security OAuth2 accessToken
NoClassDefFoundError: javax/xml/bind/UnmarshalException - Spring Security oauth2
在 Spring Security 中具有密码授权的 oAuth2 客户端
Spring Cloud Gateway OAuth2 with Spring Security OAuth2 Authorization Server = loop