func()

in pkg/provider/googleapps/u2f.go [72:116]


func (d *U2FClient) ChallengeU2F() (string, error) {
	if d.Device == nil {
		return "", errors.New("No Device Found")
	}
	request := &u2fhost.AuthenticateRequest{
		Challenge: b64Safe(d.ChallengeNonce),
		Facet:     d.Facet,
		AppId:     d.AppID,
		KeyHandle: b64Safe(d.KeyHandle),
	}
	// do the change
	prompted := false
	timeout := time.After(time.Second * 25)
	interval := time.NewTicker(time.Millisecond * 250)

	defer d.Device.Close()

	defer interval.Stop()
	for {
		select {
		case <-timeout:
			return "", errors.New("Failed to get authentication response after 25 seconds")
		case <-interval.C:
			response, err := d.Device.Authenticate(request)
			if err == nil {
				responseJSON, err := json.Marshal(response)
				if err != nil {
					return "", err
				}
				fmt.Printf("  ==> Touch accepted. Proceeding with authentication\n")
				return string(responseJSON), nil
			}

			switch err.(type) {
			case *u2fhost.TestOfUserPresenceRequiredError:
				if !prompted {
					fmt.Printf("\nTouch the flashing U2F device to authenticate...\n")
					prompted = true
				}
			default:
				return "", err
			}
		}
	}
}