OAuth 2.0. 没有会话?(无状态)

18

我将使用OAuth 2.0REST API来实现用户权限控制和良好的扩展性。

为了实现良好的扩展性,采用无状态更为简单,因为它不需要使用文件、数据库、基于内存的会话。


下面是我对OAuth 2的理解:

  1. OAuth服务器向用户提供访问令牌。
  2. 用户的访问令牌存储在cookie中。
  3. 当用户访问REST API时,用户会带上访问令牌。
  4. 服务器接收带有访问令牌的请求。
  5. 服务器查找访问令牌是否有效以及用户是否有权限进行请求。
  6. 根据用户的权限执行或拒绝请求。

因此,我不需要担心会话存储,对吧?


看一下这个库 https://pypi.python.org/pypi/python-oauth2 - DarkAnthey
我仍然认为没有人回答了确切的问题。通过会话存储,我假设是在数据库或Redis中。 因此,我正在使用Oauth 2.0,我只需要在我的数据库中针对用户存储刷新令牌。我正在使用隐式授权流程。有任何建议或评论吗? - Ayush Nigam
2个回答

11
您所描述的是OAuth 2的隐式授权流程。OAuth 2还包括其他三种流程,但由于您的资源所有者(用户)使用浏览器端Javascript发起请求(您谈到了cookies),因此这是您应该选择的流程。
在客户端方面,OAuth仅需要您存储access_token以访问受保护的资源(如果您选择一个过期的access_token,则还需要refresh_token)。

2
他需要在服务器端拥有一个数据库来检查访问令牌。;) - Artem Oboturov
当然,在服务器端,他必须知道每个访问令牌是代表哪个用户发出的,并授予了哪些范围。为了更好的安全性,他还可以选择记住和检查允许的“redirect_uri”。如果这就是他所说的“会话存储”,那么我误解了问题 ;) - Jan Gerlinger
2
忘记关于 redirect_uri 的部分,那是错误的。我应该去睡觉了 ;) - Jan Gerlinger

4
一种较新的创新是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;
}

这是一篇关于更完整示例的文章:无状态认证


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接