1

我有一个使用 rails 4 创建的 API,目前我正在尝试弄清楚如何进行登录。由于 API 将用于 iPhone 应用程序,我们决定使用令牌身份验证和 Doorkeeper/OAuth2 gem。

到目前为止,我创建了一个登录控制器来负责对用户进行身份验证(我正在使用 bcrypt 来散列密码)。

def create

  @user = User.find_by(email: params[:username])
  dbPasswordHash = BCrypt::Password.new(@user.password_digest)

  if @user == nil 
     render json: 'noUser', status: :unprocessable_entity
  else
    if dbPasswordHash == params[:password]

      client = OAuth2::Client.new(app_id, secret, :site => "http://localhost:3000/")

      access_token = client.password.get_token(@user.email, dbPasswordHash)

      render json: access_token.to_json, status: :ok, location: @user

    else
      render json: {status:'ERROR',status_info:'Wrong username/password'}, status: :unprocessable_entity
    end      
  end
end

我在上面的代码中遇到的问题是法拉第超时。问题在于 access_token 调用。由于向 /signin 发出了 POST 请求,第二个请求 (access_token) 将发送到 Doorkeeper 进行身份验证,因此必须等到第一个请求完成。

我不确定我是否过度复杂化了该过程,但我想要实现的是从前端发出请求,对用户进行身份验证并将令牌返回到前端以供将来使用。

我尝试的另一种方法是 POST 到 /oauth/token :

{ "grant_type" : "password", "username" : "test@gmail.com", "password" : "$2a$10$igmaaZkrSviHc.8Glm3hcuRdqzeT5YQwYaKFN9eUbpfcmCqA3PBiO", "client_id" : "f5cbc8d91f6e007c003e17baf3f45cb83cede4313c381afa99e456f59b08e3f8", "client_secret" : "f827f84548b33ebd8042cfbaa7aff944f5844aad7962623ed68d83963bc62bb5" }

这种方法工作正常,但密码已经散列,当我尝试使用

    dbPasswordHash = BCrypt::Password.new(params[:password])

在 doorkeeper.rb 中,我收到一个关于 BCrypt 的错误(我确实尝试过“require 'bcrypt'”)。

任何建议都会受到欢迎。

4

0 回答 0