【发布时间】:2017-09-02 20:11:20
【问题描述】:
OAuth 2.0 指定了两个client types:
- 公开 (client_id)
- 机密 (client_id:client_secret)
第 2.2 节说:
客户端标识符不是 秘密;它向资源所有者公开,不得使用 单独用于客户端身份验证。
虽然我很清楚公共客户端主要用于隐式流程,但这比看起来的要多。在执行身份验证代码流时,我们首先使用我们的 client_id 请求授权端点,不需要秘密。然后,在得到用户的同意和授权码后,我们request the token endpoint。根据规范,我们可以在没有 client_secret 的情况下请求这个端点:
client_id
REQUIRED, if the client is not authenticating with the
authorization server as described in Section 3.2.1.
如果客户类型是保密的或客户是发给客户的 凭据(或分配的其他身份验证要求), 客户端必须按照所述向授权服务器进行身份验证 在第 3.2.1 节中。
...
授权服务器必须:
...
o ensure that the authorization code was issued to the authenticated
confidential client, or if the client is public, ensure that the
code was issued to "client_id" in the request,
所以基本上本节说我们能够在没有客户端密码的情况下请求这个端点。现在,除了那些可能包含在请求中的刷新令牌之外,它没有说明任何关于刷新令牌的内容。
Refreshing an access token 提及:
因为刷新令牌通常是用于 请求额外的访问令牌,刷新令牌绑定到 发给它的客户。如果客户类型是机密的或 客户端获得了客户端凭据(或分配了其他 身份验证要求),客户端必须与 授权服务器,如第 3.2.1 节所述。
所以基本上我们可以在没有客户端身份验证的情况下刷新访问令牌。
现在,让我感到困惑的是implicit flow 不允许发布刷新令牌:
授权服务器不得发出刷新令牌。
它没有明确说明为什么我们不能这样做,只是说我们不允许这样做。我的理由是这是不允许的,因为客户端不能被信任。但是既然公共客户端允许授权代码流,为什么我们实际上需要隐式流,如果公共客户端可以实现同样的事情,再加上获取刷新令牌?
如果有人能澄清这一点,我会很高兴。
【问题讨论】: