OAuth 2.0。没有会议? (无国籍)
Posted
技术标签:
【中文标题】OAuth 2.0。没有会议? (无国籍)【英文标题】:OAuth 2.0. No session? (stateless) 【发布时间】:2012-07-12 14:07:44 【问题描述】:我将用它实现 OAuth 2.0 和 REST API
为每个用户授予不同的权限,并且可以很好地扩展。
为了更好地扩展,无状态更容易,因为有
NO 文件、数据库、基于内存的会话。
以下是我对 OAuth 2 的理解。
-
OAuth 服务器向用户提供访问令牌。
用户的访问令牌存储在 cookie 中。
当用户访问 REST API 时,用户使用访问令牌发送。
服务器接收带有访问令牌的请求。
服务器判断访问令牌是否有效,用户是否有请求权限。
根据用户的权限执行或拒绝。
所以我不必担心会话存储。对吧?
【问题讨论】:
看看这个库pypi.python.org/pypi/python-oauth2 我仍然认为没有人回答确切的问题。通过会话存储,我假设在数据库或 Redis 中。所以我使用的是 Oauth 2.0,我只需要在我的数据库中针对用户存储刷新令牌。我正在使用隐式授权流程。有什么建议或cmets? 【参考方案1】:您在此处描述的是 OAuth 2 Implicit Grant flow。 OAuth 2 还包括其他三个流程,但您的资源所有者(用户)似乎正在使用浏览器端 javascript(您在谈论 cookie)发起请求,这是您应该采用的流程。
在客户端,OAuth 只需要您存储 access_token
以访问受保护的资源(如果您要使用即将到期的 access_token
,则需要存储 refresh_token
)。
【讨论】:
要检查访问令牌,他必须有一个数据库服务器端。 ;) 当然,在服务器端,他必须知道每个访问令牌是代表哪个用户发出的,以及授予了哪些范围。或者,他还可以记住并检查允许的redirect_uri
以获得更好的安全性。如果这就是他所说的“会话存储”,我误解了这个问题;)
忘记redirect_uri
的部分,这是错误的。我应该去睡觉了;)【参考方案2】:
最近的一项创新是 JWT - JSON Web Token。
这是规范的链接: JWT - JSON Web Token
JWT 是一种使用哈希令牌的方法,它使用哈希方法,例如 HMAC,它代表基于哈希的消息身份验证代码。由于令牌使用密钥进行哈希处理,因此服务器可以确定令牌是否已被篡改。
以下是为 JWT 创建哈希令牌的示例方法:
public String createTokenForUser(User user)
byte[] userBytes = toJSON(user);
byte[] hash = createHmac(userBytes);
final StringBuilder sb = new StringBuilder(170);
sb.append(toBase64(userBytes));
sb.append(SEPARATOR);
sb.append(toBase64(hash));
return sb.toString();
这是一个解码令牌以确保其未被篡改的示例:
public User parseUserFromToken(String token)
final String[] parts = token.split(SEPARATOR_SPLITTER);
if (parts.length == 2 && parts[0].length() > 0 && parts[1].length() > 0)
try
final byte[] userBytes = fromBase64(parts[0]);
final byte[] hash = fromBase64(parts[1]);
boolean validHash = Arrays.equals(createHmac(userBytes), hash);
if (validHash)
final User user = fromJSON(userBytes);
if (new Date().getTime() < user.getExpires())
return user;
catch (IllegalArgumentException e)
//log tampering attempt here
return null;
这里有一篇文章有更完整的例子:Stateless Authentication
【讨论】:
以上是关于OAuth 2.0。没有会议? (无国籍)的主要内容,如果未能解决你的问题,请参考以下文章
Spring-OAUTH2.0:调用 /oauth/token 时没有可用资源错误
没有 Spring 安全性的 Grails 的 OAuth 2.0