2016-09-24 2 views
0

Ruby on RailsでAPIを構築していて、Devise Token Authと呼ばれる宝石でユーザー認証を構築しようとしています。しかし、私は各コ​​ントローラアクションの前にユーザーを検証/認証する最良の方法については不明です。APIのユーザー認証をテストする最良の方法は?

私はbefore_action :authenitcate_user!コールを知っていますが、私は外部クライアントから電話をかけているので、自分のユーザーはサインインしていないと思います。

私が考えていない私の要求と一緒に他の議論を引き渡す必要がありますか?トークンやセッションIDと同じですか?

答えて

1

try simple_token_authentication https://github.com/gonzalo-bulnes/simple_token_authenticationはDeviseで動作し、簡単に統合できます。 認証を実行するには、ユーザー認証トークンと電子メールを送信するだけです。

+1

どのようにこれが考案トークン認証よりも違うのですか?そして、各コントローラアクションの前にユーザーを認証するという私の問題をどのように解決するのでしょうか? – user3661956

+0

こんにちは、あなたがAPIを構築している場合は、各リクエストの認証パラメータをサーバーに送信する必要があります。この宝石は、** acts_as_token_authentication_handler_forユーザー**を含むすべてのコントローラでparams(デフォルトで電子メールとトークン)を検証します。 do ** acts_as_token_authentication_handler_forユーザーのみ:[:method1、:method2] ** – Makarov

0

軽量APIアプリケーションを構築する場合は、Knockを使用することを検討します。

Deviseは、サインアップやパスワード編集などで完全な認証ソリューションが必要な従来のアプリケーションに最適なソリューションです。しかし、セッションベースの認証を中心に設計されており、コードベースは魅力的なカスタマイズが可能なためトークンベースの認証では、そのうちの約1%しか使用しません。

基本的な設定は次のようになります。

class ApplicationController < ActionController::API 
    include Knock::Authenticable 
    prepend_before_action :authenticate_user 
end 

今、私たちは、有効なAuthorization: Bearer SOME_TOKENヘッダノックせずに要求を送信する場合は、401 - Unauthorized応答を返します。

我々はそうのようにそれをテストすることができます。

class UsersControllerTest < ActionDispatch::IntegrationTest 
    def token 
    Knock::AuthToken.new(payload: { sub: users(:one).id }).token 
    end 

    it 'does not allow an unauthenicated request' do 
    get users_path 
    assert_response :unauthorized 
    end 

    it 'allow an authenicated request' do 
    get users_path, headers: { authorization: "Bearer #{token}" } 
    assert_response :success 
    end 
end 
関連する問題