我将使用OAuth 2.0和REST API来实现用户权限控制和良好的扩展性。
为了实现良好的扩展性,采用无状态更为简单,因为它不需要使用文件、数据库、基于内存的会话。
下面是我对OAuth 2的理解:
- OAuth服务器向用户提供访问令牌。
- 用户的访问令牌存储在cookie中。
- 当用户访问REST API时,用户会带上访问令牌。
- 服务器接收带有访问令牌的请求。
- 服务器查找访问令牌是否有效以及用户是否有权限进行请求。
- 根据用户的权限执行或拒绝请求。
因此,我不需要担心会话存储,对吧?
我将使用OAuth 2.0和REST API来实现用户权限控制和良好的扩展性。
为了实现良好的扩展性,采用无状态更为简单,因为它不需要使用文件、数据库、基于内存的会话。
下面是我对OAuth 2的理解:
因此,我不需要担心会话存储,对吧?
access_token
以访问受保护的资源(如果您选择一个过期的access_token
,则还需要refresh_token
)。redirect_uri
的部分,那是错误的。我应该去睡觉了 ;) - Jan Gerlinger 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;
}
这是一篇关于更完整示例的文章:无状态认证