2017-04-08 21 views
0

私はElixirで残りのAPIを実装しています。ユーザーを認証するために、各要求にAPIキーが渡されます。フェニックスのREST APIのヘッダーベース認証

defmodule MyApp.ApiSecurity do 
    def init(options) do 
    options 
    end 

def call(conn, _opts) do 
    # checking if "api-key" headers exists 
    # and key is valid 

    # .... what's next? 
    # if it's a) valid 
    # b) invalid or there's no "api-key" header 
    # ??? 
end 
end 

私は状態とセッションの通常、フォームベースの認証のためにそれを実装する方法を知っている:プラグインでは、私は、この持っています。しかし、残りのapiにはセッションがありません。それから、私はどうしたらいいですか?言い換えれば、a)api-keyが有効な場合、関数 "call"の残りの部分には何があるべきですか?b)無効ですか?

答えて

1

キーが無効であるか存在しない場合は、通常、適切なエラーステータスコードでエラーメッセージを送信してから、Plug.Conn.halt/1を呼び出して、この要求がプラグパイプラインからさらに遠ざかるのを防ぎます。それらのキーが有効な場合は、アプリケーションの残りの部分が使用できるconn(たとえばuser_id)に値を割り当てることをお勧めします。例えば

def call(conn, _opts) do 
    case authenticate(conn) do 
    {:ok, user_id} -> 
     conn 
     |> assign(:user_id, user_id) 
    :error -> 
     conn 
     |> send_resp(401, "Unauthenticated") 
     |> halt() 
    end 
    end 
end 

さて、この1の後に差し込まれているすべてのプラグがconn.assignsで有効なuser_idを存在し、それを利用することができることを確認することができます。

より現実世界のアプローチについて、あなたはguardianこのない方法を見ることができます。

+0

はい、しかし、 '|>割り当て(:user_idは、USER_IDは)'それをセッションに挿入します。したがって、状態を作成します。残りの部分には状態があってはいけません、そうですか? – Otoma

+0

'assign'はセッションに挿入しません(' put_session'です)。 'assign'はその値をメモリの' conn'にのみ挿入し、 'conn'がガベージコレクトされると(通常はレスポンスがクライアントに送られた直後に)永久に削除されます。 – Dogbert

+0

コントローラからその格納された値にどのようにアクセスすればよいでしょうか? – Otoma