2012-07-30 86 views
10

我已经实现了一个REST API并使用门卫进行了保护。 我已经写了一个小型客户端程序来访问它,它使用资源所有者凭据流很好地工作。在OAuth中使用客户端凭证与门卫发布

现在我正在尝试使用客户端凭据flow实现呼叫。所以我按照链接中的例子。

当我使用GET请求时,一切正常,但当我使用POST请求时,我得到一个401 Unauthorized。这是对不需要资源所有者的方法的调用。

我在API控制器唯一实质性的事情是:

doorkeeper_for :all 

我还没有实现任何范围或没有那种(我需要什么?)。

我的客户代码如下所示(完全是在example in github):

require 'rest-client' 
require 'json' 

client_id = 'my_client_id...' 
client_secret = 'my_client_secret...' 

response = RestClient.post 'http://localhost:3000/oauth/token', { 
    grant_type: 'client_credentials', 
    client_id: client_id, 
    client_secret: client_secret 
} 
token = JSON.parse(response)["access_token"] 

# this line works great: 
RestClient.get 'http://localhost:3000/api/v1/flights.json', { 'Authorization' => "Bearer #{token}" } 
# this line always fails (401 Unauthorized): 
RestClient.post 'http://localhost:3000/api/v1/flights.json', { 'Authorization' => "Bearer #{token}" } 

任何想法,我可能是做错了什么?为了启用客户端凭据流,我的应用程序中是否应该执行某些特殊操作?

回答

16

我想通了。问题是我没有正确使用RestClient.post。第二个参数应该是有效载荷,第三个参数应该是标题。它应该是这样的:

RestClient.post 'http://localhost:3000/api/v1/flights.json', {}, { 'Authorization' => "Bearer #{token}" } 
+2

读你的答案帮助我解决了我遇到的一个问题。感谢您回来解决这个问题! – lyonsinbeta 2013-10-15 03:35:14