in pkg/provider/okta/okta_webauthn.go [80:130]
func (d *FidoClient) ChallengeU2F() (*SignedAssertion, error) {
if d.Device == nil {
return nil, errors.New("No Device Found")
}
request := &u2fhost.AuthenticateRequest{
Challenge: d.ChallengeNonce,
Facet: "https://" + d.AppID,
AppId: d.AppID,
KeyHandle: d.KeyHandle,
WebAuthn: true,
}
// do the change
prompted := false
timeout := time.After(time.Second * 25)
interval := time.NewTicker(time.Millisecond * 250)
var responsePayload *SignedAssertion
defer func() {
d.Device.Close()
}()
defer interval.Stop()
for {
select {
case <-timeout:
return nil, errors.New("Failed to get authentication response after 25 seconds")
case <-interval.C:
response, err := d.Device.Authenticate(request)
if err == nil {
responsePayload = &SignedAssertion{
StateToken: d.StateToken,
ClientData: response.ClientData,
SignatureData: response.SignatureData,
AuthenticatorData: response.AuthenticatorData,
}
fmt.Printf(" ==> Touch accepted. Proceeding with authentication\n")
return responsePayload, nil
}
switch err.(type) {
case *u2fhost.TestOfUserPresenceRequiredError:
if !prompted {
fmt.Printf("\nTouch the flashing U2F device to authenticate...\n")
prompted = true
}
default:
return responsePayload, err
}
}
}
}