Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何在使用doorkeeper的oauth提供商上为我的用户预授权客户端应用程序?_Ruby_Ruby On Rails 3_Oauth 2.0 - Fatal编程技术网

Ruby 如何在使用doorkeeper的oauth提供商上为我的用户预授权客户端应用程序?

Ruby 如何在使用doorkeeper的oauth提供商上为我的用户预授权客户端应用程序?,ruby,ruby-on-rails-3,oauth-2.0,Ruby,Ruby On Rails 3,Oauth 2.0,我已经编写了一个oauth提供程序,用于处理我公司的几个web应用程序。我正在使用门卫宝石,到目前为止效果很好 典型的行为是用户转到客户端应用程序,重定向到提供商进行登录,确认客户端应用程序有权访问该用户的信息,然后重定向回客户端应用程序。但是,我想跳过用户确认客户端应用程序的步骤。我想为他们做,所以没有提示 我试着模仿代码I,比如: Doorkeeper::Application.all.each do |application| auth_params = {response_type:

我已经编写了一个oauth提供程序,用于处理我公司的几个web应用程序。我正在使用门卫宝石,到目前为止效果很好

典型的行为是用户转到客户端应用程序,重定向到提供商进行登录,确认客户端应用程序有权访问该用户的信息,然后重定向回客户端应用程序。但是,我想跳过用户确认客户端应用程序的步骤。我想为他们做,所以没有提示

我试着模仿代码I,比如:

Doorkeeper::Application.all.each do |application|
  auth_params = {response_type: 'code', client_id: application.uid, redirect_uri: application.redirect_uri}
  client = Doorkeeper::OAuth::Client.find(application.uid)
  authorization = Doorkeeper::OAuth::AuthorizationRequest.new(client, user, auth_params)
  authorization.authorize
end
但这不起作用,它仍然会为用户提供客户端应用程序的授权/拒绝提示。建议?

OAuth对此有流程,门卫支持该流程。基本上,您可以使用用户凭据(用户名和密码)请求访问令牌。这样,您可以跳过用户确认,也不需要回调URL

要配置门卫,请执行以下操作:

Doorkeeper.configure do
  resource_owner_from_credentials do |routes|
    User.authenticate!(params[:username], params[:password]) # change this if needed
  end
end
Doorkeeper.configure do
  skip_authorization do
    true
  end  
end
令牌请求示例:

curl -i https://example.com/oauth/token \
     -F grant_type=password \
     -F client_id=<client_id> \
     -F client_secret=<client_secret> \
     -F username=user@example.com \
     -F password=password
另请参见门卫维基:

Doorkeeper 0.6.7提供了配置选项来执行此操作。 要配置门卫,请执行以下操作:

Doorkeeper.configure do
  resource_owner_from_credentials do |routes|
    User.authenticate!(params[:username], params[:password]) # change this if needed
  end
end
Doorkeeper.configure do
  skip_authorization do
    true
  end  
end

您可以获取应用程序的令牌,以绕过确认屏幕,将其发送到/oauth/token。根据你的喜好调整它

在客户端应用程序中:

require 'rest-client'
require 'json'

client_id = '4ea1b...'
client_secret = 'a2982...'

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"]
现在,您可以请求访问不需要资源所有者的受保护资源:

RestClient.get 'http://localhost:3000/api/v1/profiles.json', { 'Authorization' => "Bearer #{token}" }

来源:

您可以通过添加

skip_authorization do
  true
 end
到doorkeeper初始值设定项,或通过向doorkeeper
oauth\u应用程序表添加一个布尔值
预授权
,以每个应用程序为基础。然后在初始值设定项中添加如下内容:

skip_authorization do |resource_owner, client|
  client.application.preauthorized?
 end

从您的问题来看,您的公司似乎有很多应用程序,您希望使用一个身份验证平台来实现所有这些功能

现在,我假设您希望在某个位置(可能在authenticator应用程序处)显示登录屏幕。如果是这种情况,您将无法为此使用流

最好的办法是列出值得信赖的客户名单,并有条件地跳过授权,如下所示:

# config/initializers/doorkeeper.rb

Doorkeeper.configure do
  skip_authorization do |resource_owner, client|
    client.uid == "client application id of the trusted app goes here"
  end
end

如果希望客户端有自己的登录屏幕,则资源所有者凭据授予流就足够了。

如果不希望用户确认,则不应使用授权码授予场景。相反,您应该选择客户机凭据授予场景(OAuth2规范中的第4.4节),该场景的设计完全符合您的需要。不过,我对门卫不太熟悉,你们应该了解如何在rails中实现它。我正在rails中实现它。看门人是一颗宝石。我已经阅读了OAuth2规范,不希望出现客户机凭据授予场景。我自己花了一些时间实现OAuth。然而,这不是我工作的主要部分,如果我可以根据自己的需要调整一些维护内容,我不希望自己编写(并维护)。如果你想这样做,你需要在客户端应用程序中设置登录屏幕。