我正在构建一个受门卫保护的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。
我对门把源进行了挖掘,但是在这些聪明的中间件中我有点迷失了。对此有任何建议非常感谢!
答案 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