caddy-tailscale/tailscaleAuth.go
AKP 828abff8d2
Alter 5 files
Delete `module.go`
Add `caddyfile.go`
Update `go.mod`
Update `go.sum`
Add `tailscaleAuth.go`
2024-10-09 23:22:12 +01:00

53 lines
1.2 KiB
Go

package caddy_tailscale
import (
"context"
"github.com/caddyserver/caddy/v2"
"github.com/caddyserver/caddy/v2/modules/caddyhttp/caddyauth"
"net/http"
"strconv"
"tailscale.com/client/tailscale"
)
func init() {
caddy.RegisterModule(&TailscaleAuth{})
}
type TailscaleAuth struct {
lc *tailscale.LocalClient
}
// CaddyModule returns the Caddy module information.
func (*TailscaleAuth) CaddyModule() caddy.ModuleInfo {
return caddy.ModuleInfo{
ID: "http.authentication.providers.tailscale",
New: func() caddy.Module { return new(TailscaleAuth) },
}
}
func (ta *TailscaleAuth) Provision(caddy.Context) error {
ta.lc = new(tailscale.LocalClient)
return nil
}
func (ta *TailscaleAuth) Authenticate(wr http.ResponseWriter, req *http.Request) (caddyauth.User, bool, error) {
whois, err := ta.lc.WhoIs(context.Background(), req.RemoteAddr)
if err != nil {
return caddyauth.User{}, false, err
}
user := caddyauth.User{
ID: strconv.FormatInt(int64(whois.UserProfile.ID), 10),
Metadata: map[string]string{
"display_name": whois.UserProfile.DisplayName,
"login_name": whois.UserProfile.LoginName,
},
}
return user, false, nil
}
var (
_ caddy.Module = (*TailscaleAuth)(nil)
_ caddyauth.Authenticator = (*TailscaleAuth)(nil)
)