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

Posted

技术标签:

【中文标题】OAuth 2.0。没有会议? (无国籍)【英文标题】:OAuth 2.0. No session? (stateless) 【发布时间】:2012-07-12 14:07:44 【问题描述】:

我将用它实现 OAuth 2.0REST 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 时没有可用资源错误

无秘密的 OAuth 2.0 授权码授予

没有 Spring 安全性的 Grails 的 OAuth 2.0

OAuth 2.0中文译本

是否可以在没有重定向服务器的情况下使用 OAuth 2.0?

OAuth 2.0 访问令牌未加密?