【问题标题】:Doorkeeper Foreign Key Violation on Access Grants门卫外键违反访问授权
【发布时间】:2019-05-02 18:57:00
【问题描述】:

我正在尝试设置 Doorkeeper 以使我的表 Company 拥有访问和授予令牌。我关注的是this guide,但我使用的是公司而不是用户作为资源所有者。

这是我在接受预授权提示并发送到/oauth/authorize 后遇到的错误:

ERROR:  insert or update on table "oauth_access_grants" violates foreign key constraint "fk_rails_330c32d8d9"
DETAIL:  Key (resource_owner_id)=(2) is not present in table "companies".

我的架构:

add_foreign_key "oauth_access_grants", "companies", column: "resource_owner_id"
add_foreign_key "oauth_access_tokens", "companies", column: "resource_owner_id"

我的公司模型中的关联:

has_many :access_grants, class_name: 'Doorkeeper::AccessGrant', foreign_key: :resource_owner_id, dependent: :destroy
has_many :access_tokens, class_name: 'Doorkeeper::AccessToken', foreign_key: :resource_owner_id, dependent: :destroy

我还确保核对数据库 (db:reset) 并重新运行迁移 (db:migrate:reset)。在这一点上我很困惑。关于我可能会错过什么的任何想法?

如果有帮助,我正在使用 Rails 5.2.3、Doorkeeper 5.1.0 和 PostgreSQL 9.6.5。

【问题讨论】:

    标签: ruby-on-rails postgresql foreign-keys doorkeeper


    【解决方案1】:

    啊哈,看来我只需要橡皮鸭。违反了外键约束,因为我试图将我的用户 ID 分配给它,当它正在寻找公司 ID 时(碰巧具有该 ID 的公司不存在)。答案是更新我的 Doorkeeper 配置中的 resource_owner_authenticator 块。

    它通常看起来像这样:

    resource_owner_authenticator do
      User.find_by_id(session[:user_id]) || redirect_to(new_session_url)
    end
    

    但是因为我没有将用户指定为资源所有者,所以我需要对其进行修改。就我而言,我知道一个用户属于一家公司,因此更新后的块如下所示:

    resource_owner_authenticator do
      unless user = User.find_by_id(session[:user_id])
        redirect_to(new_session_url)
      end
    
      user.company
    end
    

    希望这对未来的人们有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 2019-12-26
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多