使用凭据创建新用户,然后在API中使用Doorkeeper获取该用户的令牌

时间:2013-11-20 00:07:39

标签: ruby-on-rails oauth doorkeeper

我正在构建一个受门卫保护的API。

如果我在后端手动创建用户(带密码),然后将以下内容发布到oauth/token,则Doorkeeper会成功为用户生成访问令牌并将其返回:

data = {
    username: $("#email_sign_in").val(),
    password: $("#password").val(),
    grant_type: 'password',
    client_id: '880c16e50aee5893446541a8a0b3788....',
    client_secret: 'a5108e1a1aeb87d0bb49d33d8c50d....',
    provider: 'identity'
}

但是,我正试图了解如何进行注册流程。

我很高兴users/create工作,只要它创建用户和密码,但我不知道如何在下一步生成Doorkeeper :: AccessToken,并将其返回给客户端。理想情况下,在用户#create操作中创建用户之后,我会使用用户的名称和密码重定向到POST oauth/token,但我知道您无法重定向到POST。

我对门把源进行了挖掘,但是在这些聪明的中间件中我有点迷失了。对此有任何建议非常感谢!

4 个答案:

答案 0 :(得分:24)

这是最简单的事情!我试图POST过于复杂,实际上我可以在用户#create中生成DoorKeeper :: AccessToken,然后返回。

以下是生成令牌的代码:

access_token = Doorkeeper::AccessToken.create!(:application_id => application_id, :resource_owner_id => user_id)

答案 1 :(得分:4)

我在门卫源代码中挖掘了一下,就像使用标准api方式创建令牌一样,如果您手动执行此操作,最好使用以下方法。

find_or_create_for(application, resource_owner_id, scopes, expires_in, use_refresh_token)

适合您的情况

access_token = Doorkeeper::AccessToken.find_or_create_for(application: application, resource_owner_id: user_id)

链接到门卫的源代码 find_or_create_for in doorkeeper

答案 2 :(得分:2)

在rails中,我们可以使用以下方法使用DoorKeeper创建访问令牌:

Doorkeeper::AccessToken.create!(
  application_id: nil,
  resource_owner_id: user.id,
  expires_in: 2.hours,
  scopes: 'public'
)

答案 3 :(得分:0)

理想情况下,最好的答案不是您发布的答案,我认为最好是创建一个继承自Doorkeeper::TokensController的控制器:

# app/controllers/custom_tokens_controller.rb
class CustomTokensController < Doorkeeper::TokensController
  # Override create action
  def create
    (... your custom code ...)
    super
  end
end

然后在routes.rb中定义一条新路线,例如post 'custom_tokens', to: 'custom_tokens#create'或您喜欢的任何命名方式,但操作应为create

此处提供有关此解决方案的更多详细信息:https://github.com/doorkeeper-gem/doorkeeper/wiki/Using-Resource-Owner-Password-Credentials-flow