OAuth2 资源所有者密码凭据授权流程

16

OAuth2资源所有者密码凭证流仅需要以下信息进行身份验证:

 grant_type: password
 username: test@test.de
 password: test

还是需要client_idclient_secret吗?我问这个问题是因为我想要在Ember-Simple-AuthDoorkeeper中一起使用。两者都实现了OAuth2流程,但Ember-Simple-Auth没有使用client_idclient_secret,而Doorkeeper需要这些信息才能正常工作。因此我认为其中一个没有正确实现OAuth2规范。

编辑1:

我之前也看过规范文档,但在向Doorkeeper gem填写错误报告之前,我想确定一下。不过规范文档中也有这样一段:

如果客户端类型是机密的或者客户端被授予客户端凭据(或分配其他身份验证要求),则客户端必须按照第3.2.1节中描述的方式对授权服务器进行身份验证。

编辑2:

在查看ember-simple-auth的测试时,我发现它也测试请求参数client_idclient_secret。因此我深入研究了代码,并找到了如何设置id和secret。

App.LoginController = Ember.Controller.extend(Ember.SimpleAuth.LoginControllerMixin, {
    client_id: 'id',
    client_secret: 'secret'
})

编辑3

自从在Ember-SimpleAuth进行了一次较大的重构后,编辑2中显示的解决方案不再适用。但是Doorkeeper也有所更改,现在client_idclient_secret是可选的。


在LoginController中简单地添加client_id和client_secret对我来说是不够的。你还在其他地方做了什么来使它工作吗? - marco-fiset
我在我的问题中进行了编辑。我研究了新的Ember-SimpleAuth实现,但是我找不到如何做到这一点。如果您确实需要client_id和client_secret,请在SO上创建一个问题,Ember-SimpleAuth的开发人员也在这里,并将回答它。 - kunerd
1个回答

12

你确定两者都使用了Resource Owner Password Credentials流程的oAuth吗?

查看规范,可以看到在Resource Owner Password Credentials流程中,不需要client_id和client_secret。

Authorization Code Grant规范中,规范要求客户端必须传递client_id和client_secret,但在4.3.1中说明认证服务器要求对于机密的客户端进行客户端身份验证。规范留下了客户端不是“机密”时的情况。如果在上面的问题(@Doorkeeper)中,客户端不是“机密”的话,可能就不需要client_id...


我添加了两个库的功能列表以及一些我没有完全理解的规格部分。 - kunerd
@ZólyomiIstván,规范有几个版本。所以让我们确保我们在同一页面上 - 您的4.3部分的标题是什么?我指的是“资源所有者密码凭据授权”。在那里,您不需要client_id和client_secret(与4.1授权代码授权不同,在那里清楚地说明您需要这些参数)。 - OhadR
尽管有许多草稿,规范应该只有一个版本,这里我指的是http://tools.ietf.org/html/rfc6749#section-4.3。引用规范4.3.2:“授权服务器必须:对于机密客户端或任何已发出客户端凭据的客户端要求客户端身份验证。”最初的问题是是否包括客户端ID和密钥,因此绝对需要进行身份验证。当未进行客户端身份验证(例如标题)时,4.1仅需要显式的client_id参数。 - Zólyomi István
一般而言,我同意你的观点。然而据我所知,在授权码授权(tools.ietf.org/html/rfc6749#section-4.1.1)中,规范要求客户端传递client_id和client_secret,但在4.3.1中它说(正如你引用的那样),认证服务器要求保密客户端进行客户端身份验证。规范将其留给客户端不是“保密”的情况 - 你同意吗?也许在上面的问题(Doorkeeper)中,客户端不是“保密”的? - OhadR
2
感谢大家的帮助。我发现,ember-simple-auth还支持在登录请求中发送client_idclient_secret。有关解决方案,请参见上面我的问题中的edit2。 - kunerd
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接