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.2 kB

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

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.