doorkeeper gem用户名密码验证通过后返回invalid_client错误
问题根因
你遇到的invalid_client错误和用户凭证校验无关,是Doorkeeper的密码授权流默认要求传入OAuth客户端凭证(client_id和client_secret),你当前的请求参数中没有携带这两个参数,导致客户端校验失败。
解决方案
你可以根据业务场景选择以下任意一种方案解决:
方案1:保留客户端校验(推荐,对外提供OAuth服务时使用)
- 先在你的系统中创建OAuth客户端记录,你可以通过Rails控制台执行以下代码创建:
Doorkeeper::Application.create!( name: "你的客户端名称", redirect_uri: "urn:ietf:wg:oauth:2.0:oob", # 密码流不需要跳转可以填这个值 scopes: "read write" # 按你的业务需求配置scope )
- 创建完成后,你会得到对应客户端的
client_id和client_secret,在请求/oauth/token接口时,将这两个参数加入请求参数即可,示例请求参数如下:
{ "grant_type": "password", "username": "bhagwan", "password": "你的密码", "client_id": "你生成的client_id", "client_secret": "你生成的client_secret" }
方案2:关闭密码流的客户端校验(适合内部自用接口场景)
如果你不需要对客户端进行校验,可以直接修改config/initializers/doorkeeper.rb配置,跳过密码流的客户端验证,新增以下配置即可:
grant_flows %w[password] # 新增这一段配置,跳过密码授权的客户端校验 skip_client_authentication do |grant_flows, client_authentication_method| grant_flows.include?('password') end resource_owner_from_credentials do User.find_by(email: params[:username]) &.authenticate(params[:password]) || nil end
修改配置后重启Rails服务,原来的不带client参数的请求就可以正常返回token了。
内容的提问来源于stack exchange,提问作者Bhagwan Gurav
相关产品推荐
相关产品推荐

