在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的默认错误消息。
猴子修补总是很难看,但由于门卫不能真正允许本地自定义这种行为,我认为它现在是一个有效的解决方案。
- Google OAuth访问令牌
- 未定义的方法’更改’为:更新时间戳值时的Fixnum
- Google Drive API监视400错误Ruby on Rails
- 带有Ruby on Rails和OAUTH2的Yahoo API
- 带有Doorkeeper和Angular的Oauth2密码授予类型
- 使用Google Oauth2客户端访问API时,Rails 3.2.3中的SSL错误
- rails3.2 + rspec + capybara1.0测试设计google-oauth2.0
- OmniAuth单点登录与Devise,invalid_credentials
- 从Rails调用Uber API:{“error”:“invalid_client”}