项目作者: hiyosi

项目描述 :
Go Hawk
高级语言: Go
项目地址: git://github.com/hiyosi/hawk.git
创建时间: 2016-04-23T06:45:53Z
项目社区:https://github.com/hiyosi/hawk

开源协议:MIT License

下载


hawk

Build Status
Coverage Status
GoDoc

Package hawk supports to use Hawk authentication scheme.

About Hawk: https://github.com/hueniverse/hawk

Installation

  1. go get github.com/hiyosi/hawk

Example

simple client / server

  1. // sample server
  2. package main
  3. import (
  4. "fmt"
  5. "time"
  6. "github.com/hiyosi/hawk"
  7. "net/http"
  8. )
  9. type credentialStore struct{}
  10. func (c *credentialStore) GetCredential(id string) (*hawk.Credential, error) {
  11. return &hawk.Credential{
  12. ID: id,
  13. Key: "werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn",
  14. Alg: hawk.SHA256,
  15. }, nil
  16. }
  17. var testCredStore = &credentialStore{}
  18. func hawkHandler(w http.ResponseWriter, r *http.Request) {
  19. s := hawk.NewServer(testCredStore)
  20. // authenticate client request
  21. cred, err := s.Authenticate(r)
  22. if err != nil {
  23. w.Header().Set("WWW-Authenticate", "Hawk")
  24. w.WriteHeader(401)
  25. fmt.Println(err)
  26. return
  27. }
  28. opt := &hawk.Option{
  29. TimeStamp: time.Now().Unix(),
  30. Ext: "response-specific",
  31. }
  32. // build server response header
  33. h, _ := s.Header(r, cred, opt)
  34. w.Header().Set("Server-Authorization", h)
  35. w.WriteHeader(200)
  36. w.Write([]byte("Hello, " + cred.ID))
  37. }
  38. func main() {
  39. http.HandleFunc("/resource", hawkHandler)
  40. http.ListenAndServe(":8080", nil)
  41. }
  1. // sample client
  2. package main
  3. import (
  4. "fmt"
  5. "time"
  6. "github.com/hiyosi/hawk"
  7. "io/ioutil"
  8. "net/http"
  9. )
  10. func main() {
  11. c := hawk.NewClient(
  12. &hawk.Credential{
  13. ID: "123456",
  14. Key: "werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn",
  15. Alg: hawk.SHA256,
  16. },
  17. &hawk.Option{
  18. TimeStamp: time.Now().Unix(),
  19. Nonce: "3hOHpR",
  20. Ext: "some-app-data",
  21. },
  22. )
  23. // build request header
  24. header, _ := c.Header("GET", "http://localhost:8080/resource")
  25. req, _ := http.NewRequest("GET", "http://localhost:8080/resource", nil)
  26. req.Header.Set("Authorization", header)
  27. client := &http.Client{}
  28. resp, err := client.Do(req)
  29. if err != nil {
  30. fmt.Println(err)
  31. return
  32. }
  33. defer resp.Body.Close()
  34. // authenticate server response.
  35. result, err := c.Authenticate(resp)
  36. if err != nil {
  37. fmt.Println("Server Authentication Failure")
  38. }
  39. fmt.Println("Server Authentication: ", result)
  40. b, err := ioutil.ReadAll(resp.Body)
  41. if err == nil {
  42. fmt.Println(string(b))
  43. }
  44. }

build bewit parameter

  1. // server
  2. b := hawk.NewBewitConfig(
  3. &hawk.Credential{
  4. ID: "123456",
  5. Key: "werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn",
  6. Alg: hawk.SHA256,
  7. },
  8. 10 * time.Minute,
  9. )
  10. bewit := b.GetBewit("http://localhost:8080/temp/resource", nil)
  11. fmt.Println(bewit)

authenticate bewit parameter

  1. // server
  2. func hawkBewitHandler(w http.ResponseWriter, r *http.Request) {
  3. s := hawk.NewServer(testCredStore)
  4. cred, err := s.AuthenticateBewit(r)
  5. if err != nil {
  6. w.Header().Set("WWW-Authenticate", "Hawk")
  7. w.WriteHeader(401)
  8. fmt.Println(err)
  9. return
  10. }
  11. w.WriteHeader(200)
  12. w.Write([]byte("Access Allow, " + cred.ID))
  13. }

if behind a proxy, you can use an another header field or custom hostname.

  • get host-name by specified header name.
  1. s := hawk.NewServer(testCredStore)
  2. s.AuthOption = &hawk.AuthOption{
  3. CustomHostNameHeader: "X-Forwarded-Host",
  4. }
  • or specified hostname value yourself
  1. s := hawk.NewServer(testCredStore)
  2. s.AuthOption = &hawk.AuthOption{
  3. CustomHostPort: "b.example.com:8888",
  4. }

See godoc for further documentation

Contribution

  1. Fork (https://github.com/hiyosi/hawk/fork)
  2. Create a feature branch
  3. Commit your changes
  4. Rebase your local changes against the master branch
  5. Run test suite with the go test ./... command and confirm that it passes
  6. Run gofmt -s
  7. Create new Pull Request

License

MIT