Packages

phoenix_kit

1.7.21
1.7.210 1.7.209 1.7.208 1.7.207 1.7.206 1.7.205 1.7.204 1.7.203 1.7.202 1.7.201 1.7.200 1.7.199 1.7.198 1.7.197 1.7.196 1.7.194 1.7.193 1.7.192 1.7.191 1.7.190 1.7.189 1.7.187 1.7.186 1.7.185 1.7.184 1.7.183 1.7.182 1.7.181 1.7.180 1.7.179 1.7.178 1.7.177 1.7.176 1.7.175 1.7.174 1.7.173 1.7.172 1.7.171 1.7.170 1.7.169 1.7.168 1.7.167 1.7.166 1.7.165 1.7.164 1.7.162 1.7.161 1.7.160 1.7.159 1.7.157 1.7.156 1.7.155 1.7.154 1.7.153 1.7.152 1.7.151 1.7.150 1.7.149 1.7.146 1.7.145 1.7.144 1.7.143 1.7.138 1.7.133 1.7.132 1.7.131 1.7.130 1.7.128 1.7.126 1.7.125 1.7.121 1.7.120 1.7.119 1.7.118 1.7.117 1.7.116 1.7.115 1.7.114 1.7.113 1.7.112 1.7.111 1.7.110 1.7.109 1.7.108 1.7.107 1.7.106 1.7.105 1.7.104 1.7.103 1.7.102 1.7.101 1.7.100 1.7.99 1.7.98 1.7.97 1.7.96 1.7.95 1.7.94 1.7.93 1.7.92 1.7.91 1.7.90 1.7.89 1.7.88 1.7.87 1.7.86 1.7.85 1.7.84 1.7.83 1.7.82 1.7.81 1.7.80 1.7.79 1.7.78 1.7.77 1.7.76 1.7.75 1.7.74 1.7.71 1.7.70 1.7.69 1.7.66 1.7.65 1.7.64 1.7.63 1.7.62 1.7.61 1.7.59 1.7.58 1.7.57 1.7.56 1.7.55 1.7.54 1.7.53 1.7.52 1.7.51 1.7.49 1.7.44 1.7.43 1.7.42 1.7.41 1.7.39 1.7.38 1.7.37 1.7.36 1.7.34 1.7.33 1.7.31 1.7.30 1.7.29 1.7.28 1.7.27 1.7.26 1.7.25 1.7.24 1.7.23 1.7.22 1.7.21 1.7.20 1.7.19 1.7.18 1.7.17 1.7.16 1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 1.7.9 1.7.8 1.7.7 1.7.6 1.7.5 1.7.4 1.7.3 1.7.2 1.7.1 1.7.0 1.6.20 1.6.19 1.6.18 1.6.17 1.6.16 1.6.15 1.6.14 1.6.13 1.6.12 1.6.11 1.6.10 1.6.9 1.6.8 1.6.7 1.6.6 1.6.5 1.6.4 1.6.3 1.5.2 1.5.1 1.5.0 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.2 1.3.1 1.3.0 1.2.10 1.2.9 1.2.8 1.2.7 1.2.5 1.2.4 1.2.2 1.2.1 1.2.0 1.1.0 1.0.0

A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more

Current section

Files

Jump to
phoenix_kit lib phoenix_kit_web plugs ensure_oauth_scheme.ex
Raw

lib/phoenix_kit_web/plugs/ensure_oauth_scheme.ex

defmodule PhoenixKitWeb.Plugs.EnsureOAuthScheme do
@moduledoc """
Ensures correct HTTPS scheme for OAuth callback URL generation behind reverse proxies.
This plug checks (in order):
1. `X-Forwarded-Proto` header (nginx/apache standard)
2. Explicit `:phoenix_kit, :oauth_base_url` config
3. Endpoint URL configuration
## Usage
Automatically included in OAuth controller. No manual setup required.
## Configuration (Optional)
For edge cases where headers aren't available:
config :phoenix_kit,
oauth_base_url: "https://example.com"
"""
import Plug.Conn
def init(opts), do: opts
def call(conn, _opts) do
cond do
# 1. Check X-Forwarded-Proto header (standard for nginx/apache)
forwarded_proto = get_forwarded_proto(conn) ->
apply_scheme(conn, forwarded_proto)
# 2. Check explicit oauth_base_url config
base_url = PhoenixKit.Config.get_string(:oauth_base_url) ->
apply_base_url(conn, base_url)
# 3. Check endpoint URL config
true ->
apply_endpoint_config(conn)
end
end
defp get_forwarded_proto(conn) do
case get_req_header(conn, "x-forwarded-proto") do
[proto | _] when proto in ["https", "http"] -> proto
_ -> nil
end
end
defp apply_scheme(conn, "https"), do: %{conn | scheme: :https, port: 443}
defp apply_scheme(conn, _), do: conn
defp apply_base_url(conn, base_url) when is_binary(base_url) do
uri = URI.parse(base_url)
%{
conn
| scheme: parse_scheme(uri.scheme),
host: uri.host || conn.host,
port: uri.port || default_port(uri.scheme)
}
end
defp apply_endpoint_config(conn) do
endpoint = Phoenix.Controller.endpoint_module(conn)
with endpoint when not is_nil(endpoint) <- endpoint,
url_config when is_list(url_config) <- get_endpoint_url_config(endpoint) do
# Extract scheme, host, and port from endpoint URL config
scheme = url_config[:scheme]
host = url_config[:host]
port = url_config[:port]
# Apply each config value if present
conn
|> maybe_set_scheme(scheme)
|> maybe_set_host(host)
|> maybe_set_port(port)
else
_ -> conn
end
rescue
KeyError -> conn
end
defp get_endpoint_url_config(endpoint_module) do
# Get otp_app from endpoint config (correct way)
otp_app = endpoint_module.config(:otp_app)
case Application.get_env(otp_app, endpoint_module) do
nil -> []
config -> Keyword.get(config, :url, [])
end
end
# Helper functions to conditionally set conn fields
defp maybe_set_scheme(conn, nil), do: conn
defp maybe_set_scheme(conn, scheme), do: %{conn | scheme: parse_scheme(scheme)}
defp maybe_set_host(conn, nil), do: conn
defp maybe_set_host(conn, host), do: %{conn | host: host}
defp maybe_set_port(conn, nil), do: conn
defp maybe_set_port(conn, port), do: %{conn | port: port}
defp parse_scheme("https"), do: :https
defp parse_scheme("http"), do: :http
defp parse_scheme(_), do: :https
defp default_port("https"), do: 443
defp default_port("http"), do: 80
defp default_port(_), do: 443
end