-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathtokengen.go
64 lines (56 loc) · 1.78 KB
/
tokengen.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Package tokengen provides a simple way to generate secure tokens of any
// length from any character set. Allowing for easy password, url, and token
// generation.
package tokengen
import (
"crypto/rand"
"errors"
)
const (
// Base62 [A-Za-z0-9]
Base62 = `0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`
// Base64 [A-Za-z0-9+/]
Base64 = Base62 + `+/`
// DefaultCharset Base62
DefaultCharset = Base62
)
// TokenProvider is a simple interface for abstracting token provisioning.
type TokenProvider interface {
GenerateToken() (string, error)
}
// New get a new tokengen
func New(charset string, length int) (Tokengen, error) {
if length < 1 {
return Tokengen{}, errors.New(`length must be a positive integer`)
}
if len(charset) == 0 {
return Tokengen{}, errors.New(`charset must contain characters`)
}
return Tokengen{
distributor: newRuneDistributor([]rune(charset), length, rand.Reader),
}, nil
}
// Tokengen implements TokenProvider and contains the configuration for
// generating cryptographically secure tokens.
type Tokengen struct {
distributor runeDistributor
}
// GenerateToken will provide a string of letters, picked at random from
// the given character set, with even distribution of runes from the set
// GenerateToken relies on the crypto/rand package for it's random data
// source, rather than the math package, so is ideally suited for secure
// uses such as password, token and url generation.
// func GenerateOneTimePassword() (string, error){
// tokengen, err := tokengen.New(tokengen.DefaultCharset, 12)
// if err != nil {
// return ``, err
// }
// return tokengen.GenerateToken()
// }
func (t Tokengen) GenerateToken() (string, error) {
runes, err := t.distributor.generateToken()
if err != nil {
return ``, err
}
return string(runes), nil
}