func qrcode(key *otp.Key) string { // Convert TOTP key into a PNG var buf bytes.Buffer img, err := key.Image(400, 400) if err != nil { panic(err) } png.Encode(&buf, img) return base64.StdEncoding.EncodeToString(buf.Bytes()) }
func render(key *otp.Key) []byte { const tpl = ` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>{{.Title}}</title> </head> <body style="text-align: center"> <img src="data:image/png;base64,{{ .Qrcode }}" /> <p>{{ .Issuer }}</p> <p>{{ .Account }}</p> <p>{{ .Secret }}</p> </body> </html>` t, err := template.New("webpage").Parse(tpl) data := struct { Title string Qrcode string Issuer string Account string Secret string }{ Title: "Guardian Token Generator", Qrcode: qrcode(key), Issuer: key.Issuer(), Account: key.AccountName(), Secret: key.Secret(), } var buf bytes.Buffer err = t.Execute(&buf, data) if err != nil { log.Fatal(err) } return buf.Bytes() }