Delete `module.go` Add `caddyfile.go` Update `go.mod` Update `go.sum` Add `tailscaleAuth.go`
53 lines
1.2 KiB
Go
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)
|
|
)
|