2014-01-28 208 views
5

我使用看门宝石门卫给401未授权

我的ApplicationController是这样的:

private 
def current_resource_owner 
    Person.find(doorkeeper_token.resource_owner_id) if doorkeeper_token 
end 

我DemosController是这样的:

doorkeeper_for :index 
respond_to :json 
def index 
    respond_with current_resource_owner 
end 

响应就这样产生了:

Started GET "/?code=f88d2e95b1b286645d31772c395e0e36708a5i0p970836af640f631bb4f043b5" for 127.0.0.1 at 2014-01-28 11:10:56 +0530 
Processing by DemosController#index as HTML 
Parameters: {"code"=>"f88d2e95b1b286645d31135c395e0e36708a5b5b970836af640f631bb4f043b5"} 
Filter chain halted as #<Proc:[email protected]/home/xyz/.rvm/gems/[email protected]/gems/doorkeeper-1.0.0/lib/doorkeeper/helpers/filter.rb:8> rendered or redirected 
Completed 401 Unauthorized in 1ms (ActiveRecord: 0.0ms) 
+0

你有解决这个问题吗?我收到了同样的错误。 –

回答

0

你的respond_to也需要回应html的,因为你正在请求“DemosController#指数作为HTML”

respond_to :html, :json 
2

这实际上是对看门的一个问题。要对401未授权错误,而不是一个空白页自定义JSON响应,在ApplicationController中我加:

def doorkeeper_unauthorized_render_options 
    {json: '{"status": "failure", "message":"401 Unauthorized"}'} 
end 
1

我不是100%肯定,如果我正确地理解你的问题。你的代码看起来很好,但请求似乎是错误的。

与门卫你需要一个访问令牌,而不是代码参数来访问资源(DemosController#索引)。所以首先你必须从授权码中获得访问令牌。因此提出请求

GET "/oauth/token?code=...&grant_type=authorization_code&redirect_uri=...&client_id=...&client_secret=..." 

确保REDIRECT_URI与一个与你的客户端应用程序注册的一致,并添加正确的CLIENT_ID和client_secret请求。还要始终使用新的代码参数。默认情况下,它仅在生成后10分钟内有效。注意,在定制门卫路由的情况下,url(/ oauth/token)可能不同。

如果您正确完成请求,则响应将包含有效的访问令牌。

然后发出GET请求到“/index.json?access_token = ...”而不是“/?code = ...”。 '.json'告诉Rails你的客户可以处理JSON。否则,您将得到一个406响应,这意味着所请求的格式(默认为HTML)不受支持。您也可以在HTTP标头中发送Accept =“application/json”,而不是'.json'。

401未经授权的回复,你目前收到的,意味着验证信息(在你的情况下,一个有效的访问令牌)是错误的或根本没有。

希望有所帮助。