forked from duo-labs/webauthn
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
71 lines (58 loc) · 1.5 KB
/
main.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
65
66
67
68
69
70
71
package webauthn
import (
"fmt"
"net/url"
"github.com/alesstimec/webauthn/protocol"
)
var defaultTimeout = 60000
// WebAuthn is the primary interface of this package and contains the request handlers that should be called.
type WebAuthn struct {
Config *Config
}
// The config values required for proper
type Config struct {
RPDisplayName string
RPID string
RPOrigin string
RPIcon string
// Defaults for generating options
AttestationPreference protocol.ConveyancePreference
AuthenticatorSelection protocol.AuthenticatorSelection
Timeout int
Debug bool
}
// Validate that the config flags in Config are properly set
func (config *Config) validate() error {
if len(config.RPDisplayName) == 0 {
return fmt.Errorf("Missing RPDisplayName")
}
if len(config.RPID) == 0 {
return fmt.Errorf("Missing RPID")
}
_, err := url.Parse(config.RPID)
if err != nil {
return fmt.Errorf("RPID not valid URI: %+v", err)
}
if config.Timeout == 0 {
config.Timeout = defaultTimeout
}
if config.RPOrigin == "" {
config.RPOrigin = config.RPID
} else {
u, err := url.Parse(config.RPOrigin)
if err != nil {
return fmt.Errorf("RPOrigin not valid URL: %+v", err)
}
config.RPOrigin = protocol.FullyQualifiedOrigin(u)
}
return nil
}
// Create a new WebAuthn object given the proper config flags
func New(config *Config) (*WebAuthn, error) {
if err := config.validate(); err != nil {
return nil, fmt.Errorf("Configuration error: %+v", err)
}
return &WebAuthn{
config,
}, nil
}