在rails + doorkeeper中使用grant_type = password在访问令牌请求中强制设置client_id和secret

目前我在使用doorkeeper的rails中的请求中有一个访问令牌api,其中包含用户名,密码和grant_type作为密码。 但我需要将client_id和secret作为请求中的必填字段。 我怎样才能做到这一点。 任何人都可以帮助做到这一点。

在我的doorkeeper.rb配置文件中,

resource_owner_from_credentials do |routes| #client = OAuth2::Client.new(request.params[:client_id], request.params[:client_secret], site: "http://localhost:3000/") #auth_url = client.auth_code.authorize_url(:redirect_uri => "urn:ietf:wg:oauth:2.0:oob") request.params[:user] = {:email => request.params[:username], :password => request.params[:password]} request.env["devise.allow_params_authentication"] = true request.env["warden"].authenticate!(:scope => :user) end 

我想使用用户凭据进行身份validation,并且还希望将client_id和secret设为必填字段。 如果缺少client_id和secret,我想显示一条消息。

在块内,您可以检查params[:client_id]params[:client_secret] ,并进行必要的检查以确保它们有效:)

 resource_owner_from_credentials do |routes| raise Doorkeeper::Errors::DoorkeeperError if params[:client_id].blank? || params[:client_secret].blank? dk_app = Doorkeeper::Application.find_by(uid: params[:client_id]) raise Doorkeeper::Errors::DoorkeeperError if dk_app.blank? || dk_app.secret != params[:client_secret] ## here do some checking that the client_id and secret are valid request.params[:user] = {:email => request.params[:username], :password => request.params[:password]} request.env["devise.allow_params_authentication"] = true request.env["warden"].authenticate!(:scope => :user) end 

如果您需要将错误消息更改为自定义消息,则可以参考此问题

您可以将此代码添加到您的doorkeeper.rb配置文件中,

 # Doorkeeper patch: Always require a client on resource owner password flow Doorkeeper::OAuth::PasswordAccessTokenRequest.class_eval do private def validate_client !!client end end 

它确保密码流始终需要客户端应用程序。 然后由Doorkeeper在内部validationclient_id和client_secret。 如果它们无效,则提供来自Doorkeeper的默认错误消息。

猴子修补总是很难看,但由于门卫不能真正允许本地自定义这种行为,我认为它现在是一个有效的解决方案。