0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

一人アドカレ 5日目: TinyAuthの紹介

Posted at

イントロ

自分で作ったサイトなら認証を簡単に入れられるでしょう。でもOSSで認証が備わっていないものに対して、認証を追加したいな〜って思ったことありませんか?
プルリクでわざわざ認証機能を追加するのも大変ですし、そもそもメンテナが認証機能を追加してくれないかもしれません。

そんな時に便利なのがTinyAuth

traefikのミドルウェアとして動作し、簡単に認証機能を追加できるサービスです。
例えばnginxやapacheといった自分で作ったコンテナに対してtraefikのミドルウェアをcompose.ymlのラベルに追加するだけで、ログインしないと入れないサイトに早変わりします。
そのログインも前日の4日目のPocketIDと組み合わせることで、OIDC認証を簡単に追加できちゃいます!

TinyAuthの使い方

環境情報
$ docker version
Client: Docker Engine - Community
 Version:           29.1.3
 API version:       1.52
 Go version:        go1.25.5
 Git commit:        f52814d
 Built:             Fri Dec 12 14:49:51 2025
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          29.1.3
  API version:      1.52 (minimum version 1.44)
  Go version:       go1.25.5
  Git commit:       fbf3ed2
  Built:            Fri Dec 12 14:49:51 2025
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v2.2.0
  GitCommit:        1c4457e00facac03ce1d75f7b6777a7a851e5c41
 runc:
  Version:          1.3.4
  GitCommit:        v1.3.4-0-gd6d73eb8
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

前提条件

  • Dockerがインストールされていること
  • Traefikが導入されていること(リバースプロキシサーバー)
    • Let's EncryptでTLS証明書を自動発行できるようにしておくこと

手順

  1. compose.ymlの作成

    domain.tldは自分のドメインに置き換えてください。
    https://tinyauth.domain.tldでログイン/ログアウトしたり、保護したコンテナにアクセスしに行くと自動的にtinyauthにリダイレクトされます。

    compose.yml
    services:
      tinyauth:
        image: ghcr.io/steveiliop56/tinyauth:v4
        container_name: tinyauth
        restart: unless-stopped
        networks:
          - traefik-network
        env_file:
          - .env
        environment:
          SECRET: ${TINYAUTH_SECRET}
          APP_URL: https://tinyauth.domain.tld
          PROVIDERS_AUTH_CLIENT_ID: ${TINYAUTH_AUTH_CLIENT_ID}
          PROVIDERS_AUTH_CLIENT_SECRET: ${TINYAUTH_AUTH_CLIENT_SECRET}
          PROVIDERS_AUTH_AUTH_URL: https://auth.domain.tld/authorize
          PROVIDERS_AUTH_TOKEN_URL: https://auth.domain.tld/api/oidc/token
          PROVIDERS_AUTH_USER_INFO_URL: https://auth.domain.tld/api/oidc/userinfo
          PROVIDERS_AUTH_SCOPES: openid email profile groups
          PROVIDERS_AUTH_NAME: Pocket ID
          OAUTH_AUTO_REDIRECT: auth # 保護されたサービスにアクセスしたときに自動的に認証画面にリダイレクトする
        volumes:
          - ./tinyauth-data:/data
        labels:
          traefik.enable: true
          traefik.http.routers.tinyauth.rule: Host(`tinyauth.domain.tld`)
          traefik.http.middlewares.tinyauth.forwardauth.address: http://tinyauth:3000/api/auth/traefik
          traefik.http.services.tinyauth.loadbalancer.server.port: 3000
          traefik.http.routers.tinyauth.entrypoints: websecure
          traefik.http.routers.tinyauth.tls: true
          traefik.http.routers.tinyauth.tls.certResolver: cloudflare
        networks:
          - traefik-network
    networks:
      traefik-network:
        external: true
    
  2. .envファイルの作成

    TINYAUTH_AUTH_CLIENT_ID="" # PocketIDで発行したクライアントIDを設定
    TINYAUTH_AUTH_CLIENT_SECRET="" # PocketIDで発行したクライアントシークレットを設定
    
  3. TinyAuthの起動

    下記コマンドを実行したらhttps://tinyauth.domain.tldにアクセスできる

    docker compose up -d
    

備考(Traefik Dashboardの認証有効化)

前々回のTraefikですが、ダッシュボードはログインなしでアクセスできる状態のcompose.ymlしか紹介していません。

TinyAuthを使ってダッシュボードに認証を追加する場合は、下記のようにlabelsforwardauthの設定を追加してください。
traefik.http.routers.<ルーター名>.middlewares: tinyauthの行を追加するだけで、traefikのダッシュボードに限らずなんでも簡単に認証を追加できます。

compose.yml
services:
  traefik:
    image: traefik:v3.6
    container_name: traefik
    restart: unless-stopped
    ports:
      - 80:80
      - 443:443/tcp
    volumes:
      - ./traefik.yml:/etc/traefik/traefik.yml
      - ./letsencrypt:/letsencrypt
    environment:
      TZ: Asia/Tokyo
      TRAEFIK_CERTIFICATESRESOLVERS_cloudflare_ACME_EMAIL: ${CF_API_EMAIL}
      CF_DNS_API_TOKEN: ${CLOUDFLARE_DNS_API_TOKEN}
      CF_ZONE_API_TOKEN: ${CLOUDFLARE_ZONE_API_TOKEN}
    dns:
      - 1.1.1.1
    networks:
      - default
      - traefik-network
    labels:
      traefik.enable: true
      traefik.docker.network: traefik-network
      # Dashboard & API Router
      traefik.http.routers.dashboard.rule: Host(`domain.tld`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))
      traefik.http.routers.dashboard.service: api@internal
      traefik.http.routers.dashboard.entrypoints: websecure
      traefik.http.routers.dashboard.tls: true
      traefik.http.routers.dashboard.tls.certResolver: cloudflare
+     traefik.http.routers.dashboard.middlewares: tinyauth # ここを追加するだけ
      # Redirect router
      traefik.http.routers.dashboard-redirect.rule: Host(`domain.tld`) && Path(`/`)
      traefik.http.routers.dashboard-redirect.service: api@internal
      traefik.http.routers.dashboard-redirect.entrypoints: websecure
      traefik.http.routers.dashboard-redirect.tls: true
      traefik.http.routers.dashboard-redirect.tls.certResolver: cloudflare
      traefik.http.routers.dashboard-redirect.middlewares: dashboard-redirect
      # Redirect middleware
      traefik.http.middlewares.dashboard-redirect.redirectregex.regex: ^(https://[^/]+)/?$$
      traefik.http.middlewares.dashboard-redirect.redirectregex.replacement: $${1}/dashboard/
      traefik.http.middlewares.dashboard-redirect.redirectregex.permanent: true
    depends_on:
      socket-proxy:
        condition: service_started
  socket-proxy:
    image: tecnativa/docker-socket-proxy
    restart: unless-stopped
    container_name: readonly-socket
    environment:
      CONTAINERS: 1 # コンテナ情報の読み取り(必須)
      SERVICES: 0 # サービス情報の読み取り(Swarmモード用)
      NETWORKS: 1 # ネットワーク情報の読み取り(必須)
      # セキュリティ関連
      POST: 0 # 作成禁止
      DELETE: 0 # 削除禁止
      BUILD: 0 # ビルド禁止
      IMAGES: 0 # イメージ操作不要
      VOLUMES: 0 # ボリューム操作不要
      SYSTEM: 0 # システム情報不要
      SECRETS: 0 # SECRETS不要
      CONFIGS: 0 # Configs不要
      PLUGINS: 0 # プラグイン不要
      # Swarm関連は全て不要
      SWARM: 0
      NODES: 0
      TASKS: 0
      LOG_LEVEL: warning # default infoだと結構うるさい
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - default
networks:
  default:
  traefik-network:
    external: true

TinyAuthの感想

  • 良いところ
    • Traefikのミドルウェアとして簡単に導入できる
    • PocketIDなどのOIDCプロバイダーと簡単に連携できる
    • 保護したいサービスに対して認証を追加するのが簡単
    • 柔軟性が高い
      • 背景画像の変更や、タイトルの変更が可能
      • 複数のOIDCプロバイダーの追加や、ユーザーパスワード認証も可能
  • 不満・使いこなせていないところ
    • 特になし

以上でTinyAuthの紹介を終わり!
認証をかけたいWebサービスや、認証はあるけど任意なものなどに対して、共通の認証を追加するのにとても便利です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?