OAuth 2.0。 没有会话? (无国籍)
我将使用它来实现OAuth 2.0和REST API
为每个用户授予不同的权限,并且可以很好地扩展。
为了扩展好, 无状态因为存在而更容易
NO文件,数据库,基于内存的会话。
以下是我对OAuth 2的理解。
所以我不必担心会话存储。 对?
你在这里描述的是OAuth 2隐式授权流程。 OAuth 2还包含三个其他流程,但由于您的资源所有者(用户)似乎正在使用浏览器端Javascript(您正在谈论Cookie)发起请求,因此这是您应该使用的流程。
在客户端,OAuth只要求您存储access_token
以访问受保护的资源(如果您要访问过期的access_token
,则需要refresh_token
)。
最近的一项创新是JWT - JSON Web Token。
这是一个指向规范的链接:JWT - JSON Web Token
JWT是一种使用Hashing方法(如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;
}
这里有一个更完整的例子:无状态身份验证
链接地址: http://www.djcxy.com/p/41165.html