使用凭据创建新用户,然后在 API 中使用 Doorkeeper 为该用户获取令牌
Posted
技术标签:
【中文标题】使用凭据创建新用户,然后在 API 中使用 Doorkeeper 为该用户获取令牌【英文标题】:Creating a new user with credentials, then obtaining a token for that user with Doorkeeper in an API 【发布时间】:2013-12-03 19:01:00 【问题描述】:我正在构建一个受 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 操作中创建用户后,我会使用用户名和密码重定向到 POST 到 oauth/token
,但我知道您不能重定向到 POST。
我已经深入了解了 Doorkeeper 的源代码,但我对所有这些聪明的中间件有点迷失了。非常感谢您对此提出任何建议!
【问题讨论】:
【参考方案1】:理想情况下,最好的答案不是您发布的那个,我认为创建一个继承自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
【讨论】:
【参考方案2】:在 Rails 中,我们可以使用 DoorKeeper 创建访问令牌:
Doorkeeper::AccessToken.create!(
application_id: nil,
resource_owner_id: user.id,
expires_in: 2.hours,
scopes: 'public'
)
【讨论】:
【参考方案3】:我在门卫源码中挖了一下,比如使用标准api方式创建token的方式,如果是手动的话最好使用下面的方法。
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
【讨论】:
对于新用户使用find_or
没有意义。是否假定新用户还没有任何访问令牌。【参考方案4】:
这是最简单的事情!我通过尝试 POST 使其过于复杂,而实际上我可以简单地在 user#create 中生成 DoorKeeper::AccessToken,然后返回它。
这是生成令牌的代码:
access_token = Doorkeeper::AccessToken.create!(:application_id => application_id, :resource_owner_id => user_id)
【讨论】:
谢谢!但是render status: 201, json: Doorkeeper::OAuth::TokenResponse.new(access_token)
不提供json access_token!你能告诉我怎么做吗?
@SagarRanglani 尝试render json: Doorkeeper::OAuth::TokenResponse.new(access_token).body.to_json
@leomayleomay to_json
是多余的,没有必要以上是关于使用凭据创建新用户,然后在 API 中使用 Doorkeeper 为该用户获取令牌的主要内容,如果未能解决你的问题,请参考以下文章
Youtube Data API C# - 无需请求用户凭据即可使用