14

我正在构建一个受 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 并将其返回给客户端。理想情况下,在 user#create 操作中创建用户后,我会oauth/token使用用户名和密码重定向到 POST to ,但我知道您无法重定向到 POST。

我对 Doorkeeper 源代码进行了挖掘,但对所有这些聪明的中间件有点迷失了。非常感谢您对此的任何建议!

4

4 回答 4

27

这是最简单的事情!我通过尝试发布使其过于复杂,而实际上我可以简单地在 user#create 中生成 DoorKeeper::AccessToken,然后返回它。

这是生成令牌的代码:

access_token = Doorkeeper::AccessToken.create!(:application_id => application_id, :resource_owner_id => user_id)
于 2013-11-20T11:53:22.973 回答
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源代码的链接

于 2015-12-15T04:58:39.730 回答
3

在 Rails 中,我们可以使用 DoorKeeper 创建访问令牌:

Doorkeeper::AccessToken.create!(
  application_id: nil,
  resource_owner_id: user.id,
  expires_in: 2.hours,
  scopes: 'public'
)
于 2016-11-18T15:17:00.183 回答
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

于 2019-07-12T21:12:27.487 回答