laravel-enso/core

Running HTTP local application exposerd by PROXY on HTTPS (HowTo)

robbykrlos opened this issue · 0 comments

This is a note to whomever may concern.

Prerequisites

  • Are you running the latest version?
  • Are you reporting to the correct repository?
  • Did you check the documentation?
  • Did you perform a cursory search?

Description

This is not an issue, just an information that may help others.

I have a slightly complicated infrastructure setup that I cannot change:

  • production server is hosted in an internal network (no visibility outside)
  • it was requested to be configured on http://localhost:8080
  • there is a load-balancer in front that deals with proxying and also deals with https (ssl certificates), ex: https://myapp.net

After deploying Laravel-Enso, I have considered that these changes are needed:

###.env

APP_URL=https://myapp.net
SANCTUM_STATEFUL_DOMAINS=myapp.net:443,myapp.net

###client/.env

API_URL=https://myapp.net

Ok. but this works until I try to press the login button. When I will get this API call blocked by browser because of "Mixed block":

scheme | http
host | myapp.net
filename | /api/login

So, even though all configuration is pointing my application to https, the login route /api/login is using http.

Then I've traced down to the /api/meta API call made when the login page is loaded, specifically to :

-vendor/laravel-enso/core/routes/api.php
--vendor/laravel-enso/core/src/Http/Controllers/Guest.php
---vendor/laravel-enso/core/src/Http/Responses/GuestState.php

return [
            'appName' => config('app.name'),
            'appUrl' => url('/').'/',
            'extendedDocumentTitle' => config('enso.config.extendedDocumentTitle'),
            'showQuote' => config('enso.config.showQuote'),
        ];

I was thinking initially that this is a bug, but then I looked at the url method:
-vendor/laravel/framework/src/Illuminate/Foundation/helpers.php @ function url
--vendor/laravel/framework/src/Illuminate/Routing/UrlGenerator.php @ public function to($path, $extra = [], $secure = null)
---vendor/laravel/framework/src/Illuminate/Routing/UrlGenerator.php @ public function formatScheme($secure = null)
----vendor/laravel/framework/src/Illuminate/Routing/UrlGenerator.php @ public function getScheme(): string
-----vendor/laravel/framework/src/Illuminate/Routing/UrlGenerator.php @ public function isSecure(): bool

/**
     * Checks whether the request is secure or not.
     *
     * This method can read the client protocol from the "X-Forwarded-Proto" header
     * when trusted proxies were set via "setTrustedProxies()".
     *
     * The "X-Forwarded-Proto" header must contain the protocol: "https" or "http".
     */
    public function isSecure(): bool
    {
        if ($this->isFromTrustedProxy() && $proto = $this->getTrustedValues(self::HEADER_X_FORWARDED_PROTO)) {
            return \in_array(strtolower($proto[0]), ['https', 'on', 'ssl', '1'], true);
        }

        $https = $this->server->get('HTTPS');

        return !empty($https) && 'off' !== strtolower($https);
    }

So, finally, I only needed to make sure that my Proxy server will have this header set:

Header add X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Proto "https"