OAuth 2.0。 没有会话? (无国籍)

我将使用它来实现OAuth 2.0REST API

为每个用户授予不同的权限,并且可以很好地扩展。

为了扩展好, 无状态因为存在而更容易

NO文件,数据库,基于内存的会话。


以下是我对OAuth 2的理解。

  • OAuth服务器为用户提供访问令牌。
  • 用户的访问令牌存储在cookie中。
  • 当用户访问REST API时,用户使用访问令牌进行发送。
  • 服务器通过访问令牌接收请求。
  • 服务器确定访问令牌是否有效,并且用户有权执行请求。
  • 根据用户的特权进行或拒绝。

  • 所以我不必担心会话存储。 对?


    你在这里描述的是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

    上一篇: OAuth 2.0. No session? (stateless)

    下一篇: What is the actual role of XMPP