我有一个使用 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'”)。
任何建议都会受到欢迎。