是否有必要检查刷新令牌所有权以颁发新的访问令牌?

Is it necessary to check refresh tokens ownership to issue new access tokens?

我不确定是否真正理解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 if the signature didn't match. (jwt come from PyJWT)。

是否在颁发新访问令牌之前添加这种身份检查bad/good/essential?

Is it necessary to check refresh tokens ownership

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

然而,应用程序可能强制执行的是刷新令牌和客户端 ID and/or 秘密关联。

刷新请求应如下例所示

POST /oauth/token HTTP/1.1
Host: authorization-server.com

grant_type=refresh_token
&refresh_token=xxxxxxxxxxx
&client_id=xxxxxxxxxx
&client_secret=xxxxxxxxxx

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