Add authentication from upstream providers (#107)
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is passing
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	continuous-integration/drone/push Build is passing
				
			Let BasicOIDC delegate authentication to upstream providers (Google, GitHub, GitLab, Keycloak...) Reviewed-on: #107
This commit is contained in:
		@@ -112,28 +112,61 @@
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <ul>
 | 
			
		||||
        {% for e in u.get_formatted_2fa_successful_logins() %}
 | 
			
		||||
            {% if e.can_bypass_2fa %}<li style="font-weight: bold;">{{ e.ip }} - {{ e.fmt_time() }} - BYPASS 2FA</li>
 | 
			
		||||
            {% else %}<li>{{ e.ip }} - {{ e.fmt_time() }}</li>{% endif %}
 | 
			
		||||
        {% endfor %}
 | 
			
		||||
            {% for e in u.get_formatted_2fa_successful_logins() %}
 | 
			
		||||
            {% if e.can_bypass_2fa %}
 | 
			
		||||
            <li style="font-weight: bold;">{{ e.ip }} - {{ e.fmt_time() }} - BYPASS 2FA</li>
 | 
			
		||||
            {% else %}
 | 
			
		||||
            <li>{{ e.ip }} - {{ e.fmt_time() }}</li>
 | 
			
		||||
            {% endif %}
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </ul>
 | 
			
		||||
    </fieldset>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
 | 
			
		||||
    <!-- Authorized authentication sources -->
 | 
			
		||||
    <fieldset class="form-group">
 | 
			
		||||
        <legend class="mt-4">Authorized authentication sources</legend>
 | 
			
		||||
 | 
			
		||||
        <!-- Local login -->
 | 
			
		||||
        <div class="form-check">
 | 
			
		||||
            <input class="form-check-input" type="checkbox" name="allow_local_login" id="allow_local_login"
 | 
			
		||||
                   {% if u.allow_local_login %} checked="" {% endif %}>
 | 
			
		||||
            <label class="form-check-label" for="allow_local_login">
 | 
			
		||||
                Allow local login
 | 
			
		||||
            </label>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <!-- Upstream providers -->
 | 
			
		||||
        <input type="hidden" name="authorized_sources" id="authorized_sources"/>
 | 
			
		||||
        {% for prov in providers %}
 | 
			
		||||
        <div class="form-check">
 | 
			
		||||
            <input class="form-check-input authorized_provider" type="checkbox" name="prov-{{ prov.id.0 }}"
 | 
			
		||||
                   id="prov-{{ prov.id.0 }}"
 | 
			
		||||
                   data-id="{{ prov.id.0 }}"
 | 
			
		||||
                   {% if u.can_login_from_provider(prov) %} checked="" {% endif %}>
 | 
			
		||||
            <label class="form-check-label" for="prov-{{ prov.id.0 }}">
 | 
			
		||||
                Allow login from {{ prov.name }}
 | 
			
		||||
            </label>
 | 
			
		||||
        </div>
 | 
			
		||||
        {% endfor %}
 | 
			
		||||
    </fieldset>
 | 
			
		||||
 | 
			
		||||
    <!-- Granted clients -->
 | 
			
		||||
    <fieldset class="form-group">
 | 
			
		||||
        <legend class="mt-4">Granted clients</legend>
 | 
			
		||||
        <div class="form-check">
 | 
			
		||||
            <label class="form-check-label">
 | 
			
		||||
                <input type="radio" class="form-check-input" name="grant_type"
 | 
			
		||||
                       value="all_clients" {% if u.granted_clients() == GrantedClients::AllClients %} checked="" {% endif %}>
 | 
			
		||||
                       value="all_clients" {% if u.granted_clients()== GrantedClients::AllClients %} checked="" {% endif
 | 
			
		||||
                       %}>
 | 
			
		||||
                Grant all clients
 | 
			
		||||
            </label>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="form-check">
 | 
			
		||||
            <label class="form-check-label">
 | 
			
		||||
                <input type="radio" class="form-check-input" name="grant_type"
 | 
			
		||||
                       value="custom_clients" {% if matches!(self.u.granted_clients(), GrantedClients::SomeClients(_)) %} checked="checked" {% endif %}>
 | 
			
		||||
                       value="custom_clients" {% if matches!(self.u.granted_clients(), GrantedClients::SomeClients(_))
 | 
			
		||||
                       %} checked="checked" {% endif %}>
 | 
			
		||||
                Manually specify allowed clients
 | 
			
		||||
            </label>
 | 
			
		||||
        </div>
 | 
			
		||||
@@ -155,7 +188,8 @@
 | 
			
		||||
        <div class="form-check">
 | 
			
		||||
            <label class="form-check-label">
 | 
			
		||||
                <input type="radio" class="form-check-input" name="grant_type"
 | 
			
		||||
                       value="no_client" {% if u.granted_clients() == GrantedClients::NoClient %} checked="checked" {% endif %}>
 | 
			
		||||
                       value="no_client" {% if u.granted_clients()== GrantedClients::NoClient %} checked="checked" {%
 | 
			
		||||
                       endif %}>
 | 
			
		||||
                Do not grant any client
 | 
			
		||||
            </label>
 | 
			
		||||
        </div>
 | 
			
		||||
@@ -215,6 +249,13 @@
 | 
			
		||||
    form.addEventListener("submit", (ev) => {
 | 
			
		||||
        ev.preventDefault();
 | 
			
		||||
 | 
			
		||||
        const authorized_sources = [...document.querySelectorAll(".authorized_provider")]
 | 
			
		||||
            .filter(e => e.checked)
 | 
			
		||||
            .map(e => e.getAttribute("data-id")).join(",")
 | 
			
		||||
 | 
			
		||||
        document.querySelector("input[name=authorized_sources]").value = authorized_sources;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        const authorized_clients = [...document.querySelectorAll(".authorize_client_checkbox")]
 | 
			
		||||
            .filter(e => e.checked)
 | 
			
		||||
            .map(e => e.getAttribute("data-id")).join(",")
 | 
			
		||||
@@ -231,6 +272,9 @@
 | 
			
		||||
        form.submit();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
{% endblock content %}
 | 
			
		||||
		Reference in New Issue
	
	Block a user