Ruby on rails 缺少必需的参数:范围。门卫gem从5.1.0升级到5.2.1后
doorkeeper在提供授权的Rails(5.2.3)应用程序上从5.1.0升级到5.2.1后,请求授权的应用程序的登录不再工作。授权应用程序上的页面声明Ruby on rails 缺少必需的参数:范围。门卫gem从5.1.0升级到5.2.1后,ruby-on-rails,doorkeeper,Ruby On Rails,Doorkeeper,doorkeeper在提供授权的Rails(5.2.3)应用程序上从5.1.0升级到5.2.1后,请求授权的应用程序的登录不再工作。授权应用程序上的页面声明缺少必需的参数:scope.,尽管我们不使用scope 迁移说明中有一些关于作用域的行,但它们没有告诉我 我知道我必须创建这样的迁移,但问题仍然存在: # frozen_string_literal: true class ChangeScopesOnOAuthAccessGrants < ActiveRecord::Migratio
缺少必需的参数:scope.
,尽管我们不使用scope
迁移说明中有一些关于作用域的行,但它们没有告诉我
我知道我必须创建这样的迁移,但问题仍然存在:
# frozen_string_literal: true
class ChangeScopesOnOAuthAccessGrants < ActiveRecord::Migration[5.2]
def up
change_column_default :oauth_access_grants, :scopes, from: nil, to: ''
change_column_null :oauth_access_grants, :scopes, false
end
def down
change_column_default :oauth_access_grants, :scopes, from: '', to: nil
change_column_null :oauth_access_grants, :scopes, true
end
end
在运行迁移之前和之后,我对响应进行了更深入的研究。使用Doorkeeper模块的AuthorizationsController\new
中的binding.pry
(继承自Doorkeeper::ApplicationController
),我可以确认Doorkeeper::OAuth::PreAuthorization
的实例对于属性scope
返回nil
,但对于scopes
调用pre\u auth.authorizable?
后,我得到以下对象和值:
#<Doorkeeper::OAuth::PreAuthorization:0x00007fad33f25390
@client=
#<Doorkeeper::OAuth::Client:0x00007fad364b22e8
@application=
#<Doorkeeper::Application:0x00007fad364b26d0
id: 2,
name: "...",
uid: "...",
secret: "..",
redirect_uri:
"http://localhost:3001/users/auth/doorkeeper/callback",
scopes: "",
created_at: Tue, 24 Oct 2017 11:56:13 CEST +02:00,
updated_at: Thu, 03 Oct 2019 18:53:35 CEST +02:00,
confidential: true>>,
@client_id="...",
@code_challenge=nil,
@code_challenge_method=nil,
@error=:invalid_request,
@missing_param=:scope,
@redirect_uri="http://localhost:3001/users/auth/doorkeeper/callback",
@response_type="code",
@scope=nil,
@server=
#<Doorkeeper::Config:0x00007fad33b72180
@access_token_expires_in=24 hours,
@api_only=false,
@application_secret_strategy=Doorkeeper::SecretStoring::???,
@authenticate_admin=#<Proc:0x00007fad33b71d20@/Users/.../config/initializers/doorkeeper.rb:11>,
@authenticate_resource_owner=#<Proc:0x00007fad33b71eb0@/Users/.../config/initializers/doorkeeper.rb:6>,
@default_scopes=#<Doorkeeper::OAuth::Scopes:0x00007fad364cb7c0 @scopes=[]>,
@orm=:active_record,
@token_secret_strategy=Doorkeeper::SecretStoring::???>,
@state="...">
#
我目前没有任何解决问题的线索。谢谢你的提示 您需要重新运行此命令以生成与新版本兼容的迁移。这将向
oauth\u access\u grants
的scopes
属性添加一个NOTNULL选项
bundle exec rails generate doorkeeper:migration
完成后,使用rake按常规运行迁移
rake db:migrate
我也有同样的问题。似乎您总是需要在授权请求中提供
范围
参数,或者配置默认范围
(配置中有一个示例)。此外,默认或请求的作用域必须与您的一个客户端应用程序作用域匹配,否则您将得到请求的作用域无效、未知或格式错误。
这在中提到,但解释为数据库更改。链接更明确地说明了新要求:
如果客户端在请求时忽略了scope参数
授权,授权服务器必须处理
使用预定义的默认值请求或请求失败
指示无效的作用域。授权服务器应该
记录其范围要求和默认值(如果定义)
我同意这似乎没有充分记录在或,但似乎重要的是,他们更忠实于RFC6749。我使用的是
grant\u type:'authorization\u code'
,中甚至没有提到“scope”。我手动创建了此迁移,但它不起作用。但我会用你的方法再试一次。我没有意识到这种可能性。迁移将添加我已经拥有的表以及新的表。所以它不是开箱即用的。你能试用一个全新的数据库吗?我会试用一个新的数据库。我添加了更多的调试细节。到目前为止没有进展。
rake db:migrate