You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

token.go 2.0 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package octopusHttp
  2. import (
  3. "crypto/tls"
  4. "encoding/json"
  5. "errors"
  6. "github.com/go-resty/resty/v2"
  7. "time"
  8. )
  9. const (
  10. GetToken = "api/v1/token"
  11. )
  12. type TokenModel struct {
  13. Code int `json:"code"`
  14. Data string `json:"data"`
  15. Msg string `json:"msg"`
  16. }
  17. type TokenTimePair struct {
  18. Token string
  19. ExpiredAt time.Time
  20. }
  21. type Login struct {
  22. Username string `json:"user"`
  23. Password string `json:"pwd"`
  24. }
  25. type Token struct {
  26. server string
  27. host string
  28. user string
  29. pwd string
  30. tokenUrl string
  31. ttp *TokenTimePair
  32. token string
  33. }
  34. func NewToken(server, host, user, pwd string) (*Token, error) {
  35. login := Login{
  36. Username: user,
  37. Password: pwd,
  38. }
  39. jsonStr, _ := json.Marshal(login)
  40. tokenUrl := server + GetToken
  41. token, err := generateToken(jsonStr, tokenUrl, host)
  42. if err != nil {
  43. return &Token{token: "", host: host, user: user, pwd: pwd, tokenUrl: tokenUrl}, err
  44. }
  45. return &Token{token: token, host: host, user: user, pwd: pwd, tokenUrl: tokenUrl}, nil
  46. }
  47. func (t *Token) Get() (string, error) {
  48. if t.token == "" {
  49. err := t.Update()
  50. if err != nil {
  51. return "", errors.New("get token failed")
  52. }
  53. }
  54. return t.token, nil
  55. }
  56. func (t *Token) Update() error {
  57. login := Login{
  58. Username: t.user,
  59. Password: t.pwd,
  60. }
  61. jsonStr, _ := json.Marshal(login)
  62. tokenUrl := t.server + GetToken
  63. token, err := generateToken(jsonStr, tokenUrl, t.host)
  64. if err != nil {
  65. return errors.New("get token failed")
  66. }
  67. t.token = token
  68. return nil
  69. }
  70. func generateToken(jsonStr []byte, tokenUrl string, host string) (string, error) {
  71. client := resty.New().SetTimeout(time.Duration(5) * time.Second)
  72. req := client.R()
  73. var tokenResp TokenModel
  74. client.SetTLSClientConfig(&tls.Config{
  75. InsecureSkipVerify: true,
  76. })
  77. _, err := req.
  78. SetResult(&tokenResp).
  79. SetHeader("Content-Type", "application/json").
  80. SetQueryString("addr=" + host).
  81. SetBody(jsonStr).
  82. Post(tokenUrl)
  83. if err != nil {
  84. return "", err
  85. }
  86. return tokenResp.Data, nil
  87. }

PCM is positioned as Software stack over Cloud, aiming to build the standards and ecology of heterogeneous cloud collaboration for JCC in a non intrusive and autonomous peer-to-peer manner.