Extension Let Me In


Extension Basics

Title
Let Me In
Name
ckanext-let-me-in
Type
Public extension
Description
Generiert sichere One-Time-Login-Links (OTL) für passwortlosen Zugriff und bietet optionales Impostor-Subplugin für Admin-Impersonation mit zeitlich begrenzten Sessions.
CKAN versions

~2.9, ~2.10, ~2.11

Show details
Download-Url (zip)
Download-Url commit date
2025-09-22
Url to repo
Category
Authentication & Security


Background Infos

Description (long)
Show details

ckanext-let-me-in

Bietet zwei Komponenten für sicheren Benutzerzugriff:

Core Plugin: One-Time Login Links

  • Generiert sichere JWT-basierte Einmal-Login-Links
  • Mehrere Zugriffsmethoden: API (lmi_generate_otl) und CLI (ckan letmein uli)
  • Konfigurierbare Gültigkeitsdauer (Standard: 24 Stunden)
  • Links verfallen nach erster Nutzung oder TTL-Ablauf
  • Unterstützt User-ID, Username oder Email
  • ILetMeIn Interface für Custom Hooks (manage_user, before_otl_login, after_otl_login)

Impostor Subplugin (let_me_in_impostor)

WARNUNG: Nur für Test-/Entwicklungsumgebungen!

  • Web-UI für Sysadmins zur User-Impersonation
  • “Burrow Identity” Feature: Login als anderer User ohne Passwort
  • Zeitlich begrenzte Sessions (Standard: 15 Minuten)
  • Session-History mit Tracking
  • OTL-Link-Generator im Admin-Panel
  • Toolbar-Button für schnellen Zugriff
  • “Return Identity” für Rückkehr zum Admin-Account
  • Session-Verwaltung: Aktiv/Beendet/Abgelaufen
  • Audit-Trail aller Impersonation-Aktivitäten

Sicherheitsfeatures:

  • User-State-Validierung (nur Active-Users)
  • Purged-User-Checks
  • Sysadmin-Only für Impostor
  • Session-Timeouts
  • CSRF-Protection
  • Context-basierte Authentifizierung

Lizenz: AGPL-3.0

Version
1.1.3
Version release date
2025-09-22
Contact name
DataShades
Contakt email
(not set)
Contact Url
(not set)


Installation Guide

Configuration hints

Installation

pip install ckanext-let-me-in

Core Plugin

ckan.plugins = … let_me_in …

Mit Impostor Subplugin (NUR für Test/Dev!)

ckan.plugins = … let_me_in let_me_in_impostor …

DB Migration (nur für Impostor)

ckan db upgrade -p let_me_in_impostor

Konfiguration:

OTL Link TTL (Sekunden, Standard: 86400 = 24h)

ckanext.let_me_in.otl_link_ttl = 3600

Route nach Login (optional)

ckan.auth.route_after_login = dashboard.datasets

Impostor Session TTL (Sekunden, Standard: 900 = 15min)

ckanext.let_me_in.impostor.ttl = 1800

Toolbar-Button für Impostor anzeigen (Standard: true)

ckanext.let_me_in.impostor.show_toolbar_button = true

Session Records pro Seite (Standard: 10)

ckanext.let_me_in.impostor.session_records_per_page = 20

CLI Usage:

OTL per User-ID generieren

ckan letmein uli –uid=0daa9f1d-671a-49f3-a7a6-15f4a263ef49

OTL per Username

ckan letmein uli –name=rsmith

OTL per Email

ckan letmein uli –mail=rsmith@example.com

OTL mit custom TTL (in Sekunden)

ckan letmein uli –name=rsmith –ttl=7200

API Usage:

result = tk.get_action(‘lmi_generate_otl’)( context, { ‘uid’: ‘rsmith’, # oder ‘name’ oder ‘mail’ ‘ttl’: 3600 # optional } )

Returns: {‘token’: ‘jwt-token’, ‘url’: ‘http://…’, ‘user’: {…}}

ILetMeIn Interface Implementation:

class MyPlugin(p.SingletonPlugin): p.implements(ILetMeIn)

def manage_user(self, user, context):
    # Reaktiviere gesperrte User vor Login
    if user.state != model.State.ACTIVE:
        user.state = model.State.ACTIVE
        model.Session.commit()
    return user

def before_otl_login(self, user, context):
    # Custom Logging
    log.info(f"User {user.name} logging in via OTL")

def after_otl_login(self, user, context):
    # Send welcome email
    send_email(user.email, 'Welcome back!')
Plugins to configure (ckan.ini)
let_me_in let_me_in_impostor
CKAN Settings (ckan.ini)
# ckanext.let_me_in.otl_link_ttl = 3600 # ckan.auth.route_after_login = dashboard.datasets # ckanext.let_me_in.impostor.ttl = 1800 # ckanext.let_me_in.impostor.show_toolbar_button = true # ckanext.let_me_in.impostor.session_records_per_page = 20
DB migration to be executed
let_me_in_impostor
<< back to Extensions