0

作成中の iOS アプリでユーザー資格情報が正しく提供されているかどうかを簡単に判断できるようにしたいと考えています。

私が今セットアップした方法は、ユーザートークンを処理して返す sessions_controller.rb を使用することです。問題は、Web 経由でログオンしたい場合 (curl などによるチェックだけでなく)、認証されずに吐き出されることです。

{"success":false,"message":"ログインまたはパスワードのエラー"}

だから私の質問は...どうすれば認証を行い、Webログインを引き続き機能させることができますか? ここに私の関連ファイルがあります。私の希望は、localhost:3000/auth_checks などの URL にカールして、1 種類の認証応答を取得し、引き続きユーザーが localhost:3000/sign_in からログインできるようにすることでした。

Devise.rb より

config.skip_session_storage = [:http_auth, :token_auth]
config.token_authentication_key = :auth_token

routes.rb から

  resources :clippings
  root to: 'clippings#index'
  #devise_for :users

  resources :auth_checks
  devise_for(:users, :controllers => { :sessions => "sessions" })


  resources :posts do
  end

auth_checks_controller.rb より

class AuthChecksController < ApplicationController

before_filter :authenticate_user!

  # GET /auth_checks
  # GET /auth_checks.json
  def index
    @auth_checks = AuthCheck.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @auth_checks }
    end
  end

  # GET /auth_checks/1
  # GET /auth_checks/1.json
  def show
    @auth_check = AuthCheck.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @auth_check }
    end
  end

  # GET /auth_checks/new
  # GET /auth_checks/new.json
  def new
    @auth_check = AuthCheck.new

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @auth_check }
    end
  end

  # GET /auth_checks/1/edit
  def edit
    @auth_check = AuthCheck.find(params[:id])
  end

  # POST /auth_checks
  # POST /auth_checks.json
  def create
    @auth_check = AuthCheck.new(params[:auth_check])

    respond_to do |format|
      if @auth_check.save
        format.html { redirect_to @auth_check, notice: 'Auth check was successfully created.' }
        format.json { render json: @auth_check, status: :created, location: @auth_check }
      else
        format.html { render action: "new" }
        format.json { render json: @auth_check.errors, status: :unprocessable_entity }
      end
    end
  end

  # PUT /auth_checks/1
  # PUT /auth_checks/1.json
  def update
    @auth_check = AuthCheck.find(params[:id])

    respond_to do |format|
      if @auth_check.update_attributes(params[:auth_check])
        format.html { redirect_to @auth_check, notice: 'Auth check was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @auth_check.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /auth_checks/1
  # DELETE /auth_checks/1.json
  def destroy
    @auth_check = AuthCheck.find(params[:id])
    @auth_check.destroy

    respond_to do |format|
      format.html { redirect_to auth_checks_url }
      format.json { head :no_content }
    end
  end
end
4

1 に答える 1

0

多くのことを学びました...これが私がやったことです。あなたがこの立場にいる場合は、この方法を実行するために(あまり多くはありませんが)時間をかけることを強くお勧めします. http://www.cocoahunter.com/blog/2013/02/13/restful-api-authentication/

あなたが私のような人なら、標準的なデバイスのログイン構造を使ったユーザーベースをすでに持っているでしょう。

これをroutes.rbに追加しました

  namespace :api do
      namespace :v1  do
        resources :tokens,:only => [:create, :destroy]
      end
    end

次に、tokens_controller.rb を controller/api/v1/ 内に作成して追加しました (これは私が作成したものです)。

# encoding: utf-8
class Api::V1::TokensController  < ApplicationController
    skip_before_filter :verify_authenticity_token
    respond_to :json
    def create
      email = params[:email]
      password = params[:password]
      if request.format != :json
        render :status=>406, :json=>{:message=>"The request must be json"}
        return
       end

    if email.nil? or password.nil?
       render :status=>400,
              :json=>{:message=>"The request must contain the user email and password."}
       return
    end

    @user=User.find_by_email(email.downcase)

    if @user.nil?
      logger.info("User #{email} failed signin, user cannot be found.")
      render :status=>401, :json=>{:message=>"Invalid email or passoword."}
      return
    end

    # http://rdoc.info/github/plataformatec/devise/master/Devise/Models/TokenAuthenticatable
    @user.ensure_authentication_token!

    if not @user.valid_password?(password)
      logger.info("User #{email} failed signin, password \"#{password}\" is invalid")
      render :status=>401, :json=>{:message=>"Invalid email or password."}
    else
      render :status=>200, :json=>{:token=>@user.authentication_token}
    end
  end

  def destroy
    @user=User.find_by_authentication_token(params[:id])
    if @user.nil?
      #logger.info(“Token wasnot found.”)
      #render :status=>404, :json=>{:message=>”Invalid token.”}
    else
      @user.reset_authentication_token!
      render :status=>200, :json=>{:token=>params[:id]}
    end
  end

end

文字通り、それが私がしなければならなかったすべてです。これで、iOS アプリからの認証のためにこの API をテストできます。そこにいる誰かにとってそれが理にかなっていることを願っています!

于 2013-09-29T05:09:54.510 に答える