3

Rails バックエンドを備えた PhoneGap アプリがあります。JSONを使用してモバイルアプリからユーザーを認証する最善の方法を見つけようとしています。

現在deviseを使用していますが、それを使用する必要はありません。Phonegap でモバイル アプリと連携するようにデバイスを変更する最も簡単な方法は何ですか?

これに関する投稿がかなりあることは知っています...しかし、それらのいくつかは時代遅れであるか、非常に複雑なハックのようです. いくつかの試行済みおよびテスト済みのプロジェクトまたはチュートリアルからの最新情報があることを願っています。

私が見つけた 1 つの投稿では、jsonp の使用も提案されていますが、これもかなり複雑なハックのように思えました。ここで見つけることができます:http: //vimeo.com/18763953

また、この Railscast で説明されているように、最初から認証を開始したほうがよいのではないかと考えています: http://railscasts.com/episodes/250-authentication-from-scratch

ありがとう!

4

1 に答える 1

12

デバイスのセッション登録コントローラーをオーバーライドする必要があります。セッションコントローラーをオーバーライドする方法のみを示します。

まず、User モデルに移動し、Token Authenticatable モジュールを追加します。このようなもの:

devise :token_authenticatable

before_save :ensure_authentication_token

次に、devise.rb ファイルを編集して、そのモジュールを構成します。

# You can skip storage for :http_auth and :token_auth by adding those symbols to the array below.
config.skip_session_storage = [:token_auth]

# Defines name of the authentication token params key
config.token_authentication_key = :auth_token

ルートを編集して、新しいコントローラーをポイントします。

devise_for :users, :controllers => { :registrations => 'registrations', :sessions => 'sessions' }

そして、次のようにコントローラーを作成します。

class SessionsController < Devise::SessionsController
  def create
    respond_to do |format|
      format.html {
        super
      }
      format.json {
        build_resource
        user = User.find_for_database_authentication(:email => params[:user][:email])
        return invalid_login_attempt unless resource

        if user.valid_password?(params[:user][:password])
          render :json => { :auth_token => user.authentication_token }, success: true, status: :created
        else
          invalid_login_attempt
        end
      }
    end
  end

  def destroy
    respond_to do |format|
      format.html {
        super
      }
      format.json {
        user = User.find_by_authentication_token(params[:auth_token])
        if user
          user.reset_authentication_token!
          render :json => { :message => 'Session deleted.' }, :success => true, :status => 204
        else
          render :json => { :message => 'Invalid token.' }, :status => 404
        end
      }
    end
  end

  protected
  def invalid_login_attempt
    warden.custom_failure!
    render json: { success: false, message: 'Error with your login or password' }, status: 401
  end
end

Deviseには this に関するページがありますが、既に古いガイドを示しているだけです。しかし、多分それはあなたを助けるでしょう。

于 2012-11-29T18:25:54.493 に答える