【问题标题】:Is it necessary to check refresh tokens ownership to issue new access tokens?是否有必要检查刷新令牌所有权以发布新的访问令牌?
【发布时间】:2020-06-04 15:43:59
【问题描述】:

我不确定是否真的了解how refresh tokens are supposed to be stored/checked。从这个参考资料和我读过的其他内容来看,我觉得存储每个刷新令牌的所有权是有意义的。然后,此信息可用于撤销某些给定用户的刷新令牌,并为指定用户创建新的访问令牌。 (如果我错了,请纠正我)

但是当用户尝试获取新的访问令牌时尝试检查用户的身份是否有意义?例如,我只是在 刷新令牌端点中进行了这个简单的检查:

async def refresh_access_token(request):
    data = await request.form()
    query = database.session.query(RefreshToken)
    refresh_token = query.filter(RefreshToken.id == data['refresh_token']).first()
    if refresh_token is None or refresh_token.expires < utcnow():
        raise SomeError("...")

这几乎是我在为与此 refresh_token 关联的用户发出新访问令牌之前唯一要做的事情(我发送第二个请求,使用来自此 refresh_token 的所有者标识符从我的数据库中获取用户)。

同时询问用户的身份是否有意义?例如使用(可能过期的)访问令牌?还是刷新令牌应该是自给自足的?

再次,例如,也许是消歧:

    access_token = request.headers['Authorization']
    payload = jwt.decode(access_token, str(JWT_SECRET_KEY), options={'verify_exp': False})

如果签名不匹配,代码jwt.decode 将引发InvalidSignatureError。 (jwt 来自PyJWT)。

在发布新的访问令牌坏/好/必要之前添加这种身份检查吗?

【问题讨论】:

    标签: python jwt refresh-token


    【解决方案1】:

    是否需要检查刷新令牌的所有权

    这里的简短回答是不,它不属于任何 OAuth2 RFC。

    但是,应用程序可能会强制执行刷新令牌和客户端 ID 和/或秘密关联。

    刷新请求应如下例所示

    POST /oauth/token HTTP/1.1
    Host: authorization-server.com
    
    grant_type=refresh_token
    &refresh_token=xxxxxxxxxxx
    &client_id=xxxxxxxxxx
    &client_secret=xxxxxxxxxx
    

    任何其他客户端都不应该拥有与给定刷新令牌相关联的秘密,每个客户端通常只获得一个如此多的应用程序检查刷新令牌的“所有权”以确保它没有被泄露。

    【讨论】:

    • 即使对于公开可用的应用程序,这个额外的层是否也会增加一些安全性?我对攻击没有太多想法,所以我不能说清楚。我认为我对您的回答的问题是:是否有人在不知道所有者身份的情况下设法窃取刷新令牌? (在客户 ID 验证的情况下)。在客户端不公开的情况下,我想使用客户端密码会增加额外的安全级别?
    • 一个至少可以抵御攻击的薄层,来自身份验证服务器的响应不包括客户端的秘密,如果这些被监视,可以通过检查/比较所有权来防止一次攻击。内存间谍攻击通常会产生部分结果,因此刷新令牌不是由秘密泄露是合理的。
    猜你喜欢
    • 2019-09-19
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 2019-06-29
    • 1970-01-01
    • 2019-09-29
    • 2017-01-18
    相关资源
    最近更新 更多