使用凭据创建新用户,然后在 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 为该用户获取令牌的主要内容,如果未能解决你的问题,请参考以下文章

第三方许可用户名Paypal API Magento

沙盒的 PayPal API 凭据

Laravel Passport API 注册新用户

Youtube Data API C# - 无需请求用户凭据即可使用

使用新的 Instagram Graph API 获取帐户最新图像的凭据?

如何在 c# 应用程序中正确保护 api 凭据