http.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package client
  2. import (
  3. "encoding/base64"
  4. "fmt"
  5. "gopkg.in/jcmturner/gokrb5.v2/credentials"
  6. "gopkg.in/jcmturner/gokrb5.v2/gssapi"
  7. "gopkg.in/jcmturner/gokrb5.v2/krberror"
  8. "gopkg.in/jcmturner/gokrb5.v2/messages"
  9. "gopkg.in/jcmturner/gokrb5.v2/types"
  10. "net/http"
  11. "strings"
  12. )
  13. // SetSPNEGOHeader gets the service ticket and sets it as the SPNEGO authorization header on HTTP request object.
  14. // To auto generate the SPN from the request object pass a null string "".
  15. func (cl *Client) SetSPNEGOHeader(r *http.Request, spn string) error {
  16. if spn == "" {
  17. spn = "HTTP/" + strings.SplitN(r.Host, ":", 2)[0]
  18. }
  19. tkt, skey, err := cl.GetServiceTicket(spn)
  20. if err != nil {
  21. return fmt.Errorf("Could not get service ticket: %v", err)
  22. }
  23. err = SetSPNEGOHeader(*cl.Credentials, tkt, skey, r)
  24. if err != nil {
  25. return err
  26. }
  27. return nil
  28. }
  29. // SetSPNEGOHeader sets the provided ticket as the SPNEGO authorization header on HTTP request object.
  30. func SetSPNEGOHeader(creds credentials.Credentials, tkt messages.Ticket, sessionKey types.EncryptionKey, r *http.Request) error {
  31. SPNEGOToken, err := gssapi.GetSPNEGOKrbNegTokenInit(creds, tkt, sessionKey)
  32. if err != nil {
  33. return err
  34. }
  35. nb, err := SPNEGOToken.Marshal()
  36. if err != nil {
  37. return krberror.Errorf(err, krberror.EncodingError, "Could marshal SPNEGO")
  38. }
  39. hs := "Negotiate " + base64.StdEncoding.EncodeToString(nb)
  40. r.Header.Set("Authorization", hs)
  41. return nil
  42. }