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 要求が行われたため、認証のために Doorkeeper に送信される 2 番目の要求 (access_token) は、最初の要求が完了するまで待機する必要があります。
プロセスを複雑にしすぎているかどうかはわかりませんが、達成したいのは、フロントエンドからリクエストを行い、ユーザーが認証され、将来の使用のためにトークンがフロントエンドに返されることです。
私が試した別のアプローチは、次のように /oauth/token に POST することです。
{ "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'」を試しました)。
どんな提案も歓迎します。