NginxとGoで作る、お手軽ログイン機能
一言で言うと、Webアプリケーションに手軽にログイン画面を追加するためのツールです。
通常、Webアプリをパスワードで保護しようとすると、ユーザー管理やセッション管理など、色々な処理を自分で実装する必要があります。これは結構な手間ですし、セキュリティを考慮すると慎重な設計が求められます。
tinyauthは、そうした面倒な部分を肩代わりしてくれます。NginxとGo言語のミドルウェアを使うことで、既存のアプリの前にログイン機能を挟み込み、特定のユーザーだけがアクセスできるようにしてくれるんです。
実装の手間が大幅に削減できる
ユーザー認証のロジックをゼロから書く必要がありません。
既存アプリに影響を与えない
アプリケーション本体には一切手を加えることなく、ログイン機能を追加できます。これは、特にレガシーなシステムや、認証機能を組み込むのが難しいアプリにとって非常に強力なメリットです。
シンプルな構成
NginxとGo言語で構成されているため、理解しやすく、管理も簡単です。
導入は大きく分けて2つのステップになります。
Nginxのリバースプロキシ機能を使います。tinyauthが認証を担当し、認証が通ったリクエストだけをあなたのアプリケーションに転送するように設定します。
server {
listen 80;
server_name your-app.com;
location / {
# tinyauthの認証にリクエストを渡す
auth_request /auth;
# 認証が失敗した場合のエラーページ
error_page 401 = @401_error;
proxy_pass http://your-application-server;
}
location = /auth {
# tinyauthサーバーへのリクエスト
proxy_pass http://tinyauth-server;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
# 401エラーページの設定
location @401_error {
return 302 /login;
}
location /login {
# ログインページの表示
proxy_pass http://tinyauth-server;
}
}
この設定では、your-app.comへのリクエストがまず/authに送られ、そこで認証が行われます。認証が通ればproxy_passで指定したアプリケーションサーバーに転送されます。もし認証に失敗(401 Unauthorized)したら、ログインページにリダイレクトされる、という流れです。
tinyauthを動かすためのGoのコードを用意します。これは認証情報を定義するシンプルなサーバーになります。
package main
import (
"net/http"
"github.com/steveiliop56/tinyauth"
)
func main() {
// 認証情報(ユーザー名とパスワード)を定義
users := map[string]string{
"admin": "password123", // 本番環境ではもっと強力なパスワードを使いましょう!
}
// tinyauthのミドルウェアを作成
auth := tinyauth.New(
tinyauth.WithUsers(users),
tinyauth.WithLoginPage("/login"),
)
// HTTPサーバーを起動
http.Handle("/", auth(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// ここには認証後の処理を書くことができますが、今回は何もしません。
// Nginxがtinyauthの結果を見て、リクエストを転送します。
})))
http.ListenAndServe(":8080", nil)
}
このコードでは、adminというユーザー名とpassword123というパスワードを定義しています。tinyauth.New()でミドルウェアを生成し、それをHTTPサーバーに組み込むだけです。
これで、あなたのアプリケーションを認証機能付きで公開する準備が整いました。
tinyauthは、NginxとGo言語の組み合わせで、アプリケーションにログイン機能を素早く、そして安全に組み込むための素晴らしいツールです。特に、既存のアプリケーションに手を加えずに認証機能を追加したい場合に、その真価を発揮します。