From dbadadff57b6e13ff8564c0a41622c4cec2e5bea Mon Sep 17 00:00:00 2001 From: Stavros Iliopoulos Date: Sat, 26 Aug 2023 16:07:20 +0300 Subject: [PATCH] Add 2fauth. (#1071) --- README.md | 1 + apps/2fauth/config.json | 19 ++++++++++ apps/2fauth/docker-compose.yml | 36 +++++++++++++++++++ apps/2fauth/metadata/description.md | 53 ++++++++++++++++++++++++++++ apps/2fauth/metadata/logo.jpg | Bin 0 -> 6129 bytes 5 files changed, 109 insertions(+) create mode 100644 apps/2fauth/config.json create mode 100644 apps/2fauth/docker-compose.yml create mode 100644 apps/2fauth/metadata/description.md create mode 100644 apps/2fauth/metadata/logo.jpg diff --git a/README.md b/README.md index 132128bc..1b730980 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ This is the official repository for the Tipi App Store. It contains all the apps ## Apps available +- [2FAuth](https://github.com/Bubka/2FAuth) - A Web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes - [Actual Budget](https://github.com/actualbudget/actual-server) - Local-first OpenSource Budget tool - [Adguard Home](https://github.com/AdguardTeam/AdGuardHome) - Adguard Home DNS adblocker - [Audiobookshelf](https://github.com/advplyr/audiobookshelf) - Audiobookshelf is a self-hosted audiobook and podcast server. diff --git a/apps/2fauth/config.json b/apps/2fauth/config.json new file mode 100644 index 00000000..2be9bfff --- /dev/null +++ b/apps/2fauth/config.json @@ -0,0 +1,19 @@ +{ + "$schema": "../schema.json", + "name": "2FAuth", + "port": 8235, + "available": true, + "exposable": true, + "id": "2fauth", + "tipi_version": 2, + "version": "4.1.0", + "categories": [ + "security" + ], + "description": "A Web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes.", + "short_desc": "Manage your Two-Factor Authentication codes.", + "author": "Bubka", + "source": "https://github.com/Bubka/2FAuth", + "website": "https://docs.2fauth.app/", + "form_fields": [] +} diff --git a/apps/2fauth/docker-compose.yml b/apps/2fauth/docker-compose.yml new file mode 100644 index 00000000..a225f039 --- /dev/null +++ b/apps/2fauth/docker-compose.yml @@ -0,0 +1,36 @@ +version: "3.7" +services: + 2fauth: + image: 2fauth/2fauth:4.1.0 + container_name: 2fauth + volumes: + - ${APP_DATA_DIR}/data:/2fauth + ports: + - ${APP_PORT}:8000 + networks: + - tipi_main_network + labels: + # Main + traefik.enable: true + traefik.http.middlewares.2fauth-web-redirect.redirectscheme.scheme: https + traefik.http.services.2fauth.loadbalancer.server.port: 8000 + # Web + traefik.http.routers.2fauth-insecure.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.2fauth-insecure.entrypoints: web + traefik.http.routers.2fauth-insecure.service: 2fauth + traefik.http.routers.2fauth-insecure.middlewares: 2fauth-web-redirect + # Websecure + traefik.http.routers.2fauth.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.2fauth.entrypoints: websecure + traefik.http.routers.2fauth.service: 2fauth + traefik.http.routers.2fauth.tls.certresolver: myresolver + # Local domain + traefik.http.routers.2fauth-local-insecure.rule: Host(`2fauth.${LOCAL_DOMAIN}`) + traefik.http.routers.2fauth-local-insecure.entrypoints: web + traefik.http.routers.2fauth-local-insecure.service: 2fauth + traefik.http.routers.2fauth-local-insecure.middlewares: 2fauth-web-redirect + # Local domain secure + traefik.http.routers.2fauth-local.rule: Host(`2fauth.${LOCAL_DOMAIN}`) + traefik.http.routers.2fauth-local.entrypoints: websecure + traefik.http.routers.2fauth-local.service: 2fauth + traefik.http.routers.2fauth-local.tls: true diff --git a/apps/2fauth/metadata/description.md b/apps/2fauth/metadata/description.md new file mode 100644 index 00000000..a0363b98 --- /dev/null +++ b/apps/2fauth/metadata/description.md @@ -0,0 +1,53 @@ +# 2FAuth + +A web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes + +[**2FAuth Demo**](https://demo.2fauth.app/) +Credentials (login - password) : *demo@2fauth.app* - *demo* + +## Purpose + +2FAuth is a web based self-hosted alternative to One Time Passcode (OTP) generators like Google Authenticator, designed for both mobile and desktop. + +It aims to ease you perform your 2FA authentication steps whatever the device you handle, with a clean and suitable interface. + +I created it because : + +* Most of the UIs for this kind of apps show tokens for all accounts in the same time with stressful countdowns (in my opinion) +* I wanted my 2FA accounts to be stored in a standalone database I can easily backup and restore (did you already encountered a smartphone loss with all your 2FA accounts in Google Auth? I did...) +* I hate taking out my smartphone to get an OTP when I use a desktop computer +* I love coding and I love self-hosted solutions + +## Main features + +* Manage your 2FA accounts and organize them using Groups +* Scan and decode any QR code to add account in no time +* Add custom account without QR code thanks to an advanced form +* Edit accounts, even the imported ones +* Generate TOTP and HOTP security codes and Steam Guard codes + +2FAuth is currently fully localized in English and French. See [Contributing](#contributing) if you want to help on adding more languages. + +## Security + +2FAuth provides several security mechanisms to protect your 2FA data as best as possible. + +### Single user app + +You have to create a user account and authenticate yourself to use the app. It is not possible to create more than one user account, the app is thought for personal use. + +### Modern authentication + +You can sign in 2FAuth using a security key like a Yubikey or a Titan key and disable the traditional login form. + +### Data encryption + +Sensitive data stored in the database can be encrypted to protect them against db compromise. Encryption is provided as an option which is disabled by default. It is strongly recommanded to backup the APP_KEY value of your .env file (or the whole file) when encryption is On. + +### Auto logout + +2FAuth automatically log you out after an inactivity period to prevent long life session. The auto logout can be deactivated or triggered when a security code is copied. + +### RFC compliance + +2FAuth generates OTP according to RFC 4226 (HOTP Algorithm) and RFC 6238 (TOTP Algorithm) thanks to [Spomky-Labs/OTPHP](https://github.com/Spomky-Labs/otphp) php library. diff --git a/apps/2fauth/metadata/logo.jpg b/apps/2fauth/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d7f78b82cf1ec7d6e45363a5371265ecd4e8b2c5 GIT binary patch literal 6129 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 literal 0 HcmV?d00001