私は Phoenix 1.6 アプリに取り組んでいます。動作していたGitHub経由の認証にUeberauthを使用しました。認証されたユーザーができる、トピックとコメントを投稿するためのチャネルをセットアップしました。次に、チャネルで使用するユーザー トークンを追加してみました。mix phx.new.socket Userを使用して作成された定型コードの指示に従っていました。user_socket.jsファイルには、テンプレートでトークンを作成するための指示があり、機能しました。トークンは、connect関数のuser_socket.exで検証されます。トークンをconnに追加するために、router.exに新しいプラグput_user_tokenを作成しました。、これも機能しました。しかし、プラグ内のロジックに問題がありました。これは私のコードです:
defp put_user_token(conn, _) do
if conn.assigns.user do
token = Phoenix.Token.sign(conn, "user socket", conn.assigns.user.id)
assign(conn, :user_token, token)
else
conn
end
これは、ログインしている限り機能します。問題は、ログアウトして再度ログインしようとしたときです。プラグ内の if ステートメントのボイラープレート コードは次のとおりです。
if current_user = conn.assigns[:current_user] do
現在のユーザーがuserとして定義されており、値がデータベース内のユーザー レコードの ID と等しいため、私のコードは異なります。問題は、Ueberauth をセットアップするときに、 put_user_tokenプラグの前に別のプラグSetUserを作成したことだと思います。これは SetUser の呼び出し関数です。
def call(conn, _opts) do
user_id = get_session(conn, :user_id)
cond do
user = user_id && Repo.get(User, user_id) ->
assign(conn, :user, user)
true ->
assign(conn, :user, nil)
end
end
ログアウトした後、アプリがホームページにリダイレクトされ、プラグが実行され、 conn.assigns.userの値がnilに設定されているようです。その後、エラーが発生し、再度ログインできません。
put_user_tokenプラグのifステートメントでnil値を処理できるようにする方法を考える必要があります。is_integer(conn.assigns.user)と他のいくつかの比較を試しましたが、 nilの値が存在する場合、アプリはクラッシュします。