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 要求が行われたため、認証のために 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'」を試しました)。

どんな提案も歓迎します。

4

0 に答える 0