64 lines
1.3 KiB
Go
64 lines
1.3 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"github.com/pquerna/otp"
|
||
|
"github.com/pquerna/otp/totp"
|
||
|
|
||
|
"bufio"
|
||
|
"bytes"
|
||
|
"fmt"
|
||
|
"image/png"
|
||
|
"io/ioutil"
|
||
|
"os"
|
||
|
)
|
||
|
|
||
|
func display(key *otp.Key, data []byte) {
|
||
|
fmt.Printf("Issuer: %s\n", key.Issuer())
|
||
|
fmt.Printf("Account Name: %s\n", key.AccountName())
|
||
|
fmt.Printf("Secret: %s\n", key.Secret())
|
||
|
fmt.Println("Writing PNG to qr-code.png....")
|
||
|
ioutil.WriteFile("qr-code.png", data, 0644)
|
||
|
fmt.Println("")
|
||
|
fmt.Println("Please add your TOTP to your OTP Application now!")
|
||
|
fmt.Println("")
|
||
|
}
|
||
|
|
||
|
func promptForPasscode() string {
|
||
|
reader := bufio.NewReader(os.Stdin)
|
||
|
fmt.Print("Enter Passcode: ")
|
||
|
text, _ := reader.ReadString('\n')
|
||
|
return text
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
key, err := totp.Generate(totp.GenerateOpts{
|
||
|
Issuer: "Example.com",
|
||
|
AccountName: "alice@example.com",
|
||
|
})
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
// Convert TOTP key into a PNG
|
||
|
var buf bytes.Buffer
|
||
|
img, err := key.Image(200, 200)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
png.Encode(&buf, img)
|
||
|
|
||
|
// display the QR code to the user.
|
||
|
display(key, buf.Bytes())
|
||
|
|
||
|
// Now Validate that the user's successfully added the passcode.
|
||
|
fmt.Println("Validating TOTP...")
|
||
|
passcode := promptForPasscode()
|
||
|
valid := totp.Validate(passcode, key.Secret())
|
||
|
if valid {
|
||
|
println("Valid passcode!")
|
||
|
os.Exit(0)
|
||
|
} else {
|
||
|
println("Invalid passocde!")
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
}
|