Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problème d'urls non-https #1330

Closed
seegwen opened this issue Dec 18, 2024 · 9 comments
Closed

Problème d'urls non-https #1330

seegwen opened this issue Dec 18, 2024 · 9 comments

Comments

@seegwen
Copy link

seegwen commented Dec 18, 2024

Bonjour,

J'ai un petit souci, je suis certain que c'est une erreur toute bête de ma part mais je ne parviens pas à la cerner:

J'ai GTA et GTR installés sur la même machine dans des conteneurs docker.
GTA est derrière un proxy nginx. GTR ne l'est plus (il l'était avant mais je me suis rendu compte que je n'en avais pas pas besoin) car...
Mon serveur a en tête un proxy/LB traefik.

Donc j'ai traefik <-> nginx <-> gta et traefik <-> GTR.

Tout fonctionne très bien sauf les urls des pictogrammes qui sont générés en http et non en https. Les navigateurs sécurisés me disent: "mixed content"/pas-moyen. Et les navigateurs malins essaient quand même en https, au cas-où... et ils ont raison. N'empêche que GTR écris les urls des pictos en http et cela me semble un problème.

Sur la page d'accueil de GTR, les pictos ne s'affichent pas:
https://rando.itineraireschalaisiens.fr
Capture d’écran 2024-12-18 à 16 10 57

Ma config nginx coté GTA (partielle pour pas flooder):

[...]
    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_redirect off;

[...]

Les configs de GTR:
home.json

{
  "welcomeBanner": false,
  "activityBar": {
    "shouldDisplay": true,
    "links": [
      { "type": "trek", "grouped": false, "iconUrl": "https://geotrek.itineraireschalaisiens.fr/media/upload/practice-foot.svg" },
      { "type": "outdoorSite", "grouped": false, "iconUrl": "https://geotrek.itineraireschalaisiens.fr/media/upload/gravel-bike_MilYOuB.svg" }
    ]
  },
  "suggestions": {
    "default": [
      {
        "titleTranslationId": "home.territoryTreks",
        "iconUrl": "/icons/practice-pedestrian.svg",
        "ids": ["2", "582", "586", "501", "771", "596"],
        "type": "trek"
      },
      {
        "titleTranslationId": "home.events",
        "iconUrl": "/icons/category-events.svg",
        "ids": ["1", "5"],
        "type": "events"
      },
      {
        "titleTranslationId": "home.outdoor",
        "iconUrl": "/icons/practice-outdoor.svg",
        "ids": ["65", "12", "79"],
        "type": "outdoor"
      },
      {
        "titleTranslationId": "home.services",
        "iconUrl": "/icons/category-services.svg",
        "ids": ["1", "6", "476"],
        "type": "service"
      },
      {
        "titleTranslationId": "home.itinerantTreks",
        "iconUrl": "/icons/practice-pedestrian.svg",
        "ids": ["501", "771", "604"]
      }
    ]
  }
}

global.json

{
  "apiUrl": "https://geotrek.itineraireschalaisiens.fr/api/v2",
  "baseUrl": "https://rando.itineraireschalaisiens.fr/",
  "applicationName": "ITAC",
  "enableOutdoor": false,
  "enableServerCache": true,
  "enableTouristicEvents": false,
  "displayObjectsRelatedToItinerantTreks": {
    "POIs": true,
    "touristicContents": false,
    "sensitiveAreas": false,
    "infrastructures": false,
    "signages": false,
    "service": false
  }
}

Dans les sources de GTR je vois ça:

<script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"dehydratedState":{"mutations":[],"queries":[{"state":{"data":{"initialFiltersState":[{"id":"practices","options":[{"value":"4","label":"Pédestre","pictogramUrl":"http://geotrek.itineraireschalaisiens.fr/media/upload/practice-foot.svg"},{"value":"5","label":"Vélo Gravel","pictogramUrl":"http://geotrek.itineraireschalaisiens.fr/media/upload/gravel-bike_MilYOuB.svg"}]
[...]

On voit que les pictogramUrl ont des url en http et pas https. Le pb passe par là de toute évidence mais je n'ai pas réussi à remonter plus et voir comment est généré ce NEXT_DATA et quel drapeau de config et/ou header ou autre j'aurais pu manquer.

J'aurais bien besoin d'un peu d'aide je suis à court d'idées.

@babastienne
Copy link
Member

A priori la config de Geotrek-Rando est superflue et le problème vient plutôt de Geotrek-Admin ou de son nginx car quand je vais faire un test sur l'API les pictos sont bien renvoyés en http au lieu d'https : https://geotrek.itineraireschalaisiens.fr/api/v2/trek_practice/

Si on fix ce problème alors ça fonctionnera normalement dans GTR.

J'ai déjà vu ce problème il y a quelques mois mais je ne me souviens plus de l'origine ... 😬

Est-ce que vous avez bien activé la configuration correspondante dans le custom.py pour avoir du SSL : https://geotrek.readthedocs.io/en/2.111.0/install/configuration.html#activate-ssl-https ?

@seegwen
Copy link
Author

seegwen commented Dec 19, 2024

Oui la config:

SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

est déjà en place.

@babastienne
Copy link
Member

Ok. Peux-tu transmettre le contenu de ton fichier custom.py et ta conf nginx de GTA complète ?

@seegwen
Copy link
Author

seegwen commented Dec 19, 2024

Oui, bien sur. Merci de m'aider.

custom.py

Details

# import os

#
# BASIC SETTINGS
# ..............
# SRID = 2154  # LAMBERT EXTENDED FOR FRANCE, used for geometric columns.
# Must be a projection in meters Fixed at install, don't change it after
#
# DEFAULT_STRUCTURE_NAME = 'My structure' # -> Name for your default structure. Can be changed in geotrek admin interface
#
# SPATIAL_EXTENT = (105000, 6150000, 1100000, 7150000)
# spatial bbox in your own projection (example here with 2154)
# this spatial_extent will limit map exploration, and will cut your raster imports
#
# LANGUAGE_CODE = 'en' # for web interface. default to fr (French)

# MODELTRANSLATION_LANGUAGES = ('en', 'fr', 'it', 'es')
# Change with your own wanted translations
# ex: MODELTRANSLATION_LANGUAGES = ('en', 'fr', 'de', 'ne')

# ADMINS = (
#     ('admin1', '[email protected]'), # change with tuple ('your name', '[email protected]')
# )
# used to send error mails

# MANAGERS = (
#     ('manager1', '[email protected]'), # change with tuple ('your name', '[email protected]')
# )

# or MANAGERS = ADMINS
# used to send report mail

# TIME_ZONE="Europe/Paris"
# set your timezone for date format. For France, uncomment line beside
# For other zones : find your timezone in https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

#
# MAIL SETTINGS
# ..........................
# DEFAULT_FROM_EMAIL =
# address will be set for sended emails (ex: [email protected])
# SERVER_EMAIL = DEFAULT_FROM_EMAIL
# EMAIL_HOST =
# EMAIL_HOST_USER =
# EMAIL_HOST_PASSWORD =
# EMAIL_PORT =
# EMAIL_USE_TLS = False
# EMAIL_USE_SSL = False

#
# External authent if required
# ..........................

# AUTHENT_DATABASE = 'your_authent_dbname'
# AUTHENT_TABLENAME = 'your_authent_table_name'
# if AUTHENT_TABLENAME:
#     AUTHENTICATION_BACKENDS = ('geotrek.authent.backend.DatabaseBackend',)

# IF YOU USE SSL

SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

# Dynamic segmentation
# TREKKING_TOPOLOGY_ENABLED = False

# TREK_POI_INTERSECTION_MARGIN=700

nginx.conf

Details

upstream ui_server {
    server web:8000;
}

upstream api_server {
    server api:8000;
}

map $http_origin $allow_origin {
    ~^https?://(.*\.)?itineraireschalaisiens.fr(:\d+)?$ $http_origin;
    "http://itac.local" $http_origin;
    default "";
}

server {
    server_name geotrek.itineraireschalaisiens.fr;
    server_name_in_redirect on;
    server_tokens off;
    gzip             on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level  4;
    gzip_types       application/json application/geo+json;

    access_log /var/log/nginx/geotrek_access.log;
    error_log /var/log/nginx/geotrek_error.log;

    client_max_body_size 200M;

    location /static {
        expires 1d;
        alias /var/www/static;
    }

    location /media {
        expires 1d;
        alias /var/www/media ;
        add_header Access-Control-Allow-Origin $allow_origin;
    }

    location /media_secure {
        internal;
        expires 1d;
        alias /var/www/media;
    }

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_redirect off;

        location ~ ^/api {
            proxy_pass http://api_server;
            proxy_read_timeout 300s;
            add_header 'Access-Control-Allow-Origin' '*' always;
        }

        proxy_pass http://ui_server;
        proxy_read_timeout 300s;
    }

    listen 80;
}

@babastienne
Copy link
Member

Dans ton custom.py peux-tu essayer de rajouter la ligne USE_X_FORWARDED_HOST = True puis faire ta procédure de mise à jour et voir si le problème persiste ?

@seegwen
Copy link
Author

seegwen commented Dec 19, 2024

Merci. Non cela n'a rien changé.

@babastienne
Copy link
Member

Ok. Dans ce cas c'est clairement un problème lié à la configuration réseau, spécifique entre traefik et nginx. Sur ce point je n'ai pas de compétences.

Ce que je sais c'est que généralement on gère les certificats SSL directement depuis nginx. Là vu la configuration ça ne semble pas être le cas.

Récapitulatif du problème :

  • GTA, lorsqu'il envoi des liens via l'API, envoi les liens au format HTTP alors qu'il devrait le faire au format HTTPS.
  • Pour cela, GTA a besoin de savoir que la requête "d'origine" est elle-même en HTTPS. Sauf que vu la configuration réseau actuelle, GTA a l'impression d'être uniquement en HTTP.
  • Pour permettre à GTA de savoir quel est le protocole utilisé il faut configurer le serveur web avec l'ajout du header X-Forwarded-Proto
  • On voit que ce header est bien présent et correctement configuré dans la configuration nginx actuelle. Donc si nginx reçoit une requête en HTTPS normalement il devrait la transférer "telle quelle" vers GTA
  • Donc je pense que le problème vient du lien entre traefik et nginx : je suppose que traefik ne forward pas le protocole utilisé vers NGINX qui traite donc des requêtes HTTP et transfert cette information à GTA.

Le problème est donc plutôt réseau/système qu'applicatif, je ne peux pas aider. Je recommande d'aller chercher de l'aide auprès de la communauté Traefik (il y a déjà quelques sujets ici ou et sûrement ailleurs).

Si tu as la garantie que le protocole HTTPS est bien transféré jusqu'à GTA et que le problème persiste alors ça signifierai que c'est un problème applicatif et dans ce cas n'hésite pas à revenir vers nous.

@babastienne
Copy link
Member

Je clôture ce ticket car hors scope de Geotrek. N'hésite pas à le rouvrir si tu as des éléments complémentaires permettant de penser que le problème est lié à l'applicatif.

@babastienne babastienne closed this as not planned Won't fix, can't repro, duplicate, stale Dec 19, 2024
@seegwen
Copy link
Author

seegwen commented Dec 19, 2024

Entendu. J'ai déjà pas mal creusé et lu des topics en ligne. Et je sèche toujours. Je suis persuadé que je suis passé à coté d'un tout petit détail.

En tout cas merci pour ton aide et le temps que tu m'as donné @babastienne. 🙏

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants