auth.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package auth
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/gravitl/netmaker/models"
  6. "github.com/gravitl/netmaker/netclient/config"
  7. // "os"
  8. "context"
  9. "io/ioutil"
  10. nodepb "github.com/gravitl/netmaker/grpc"
  11. "google.golang.org/grpc/codes"
  12. "google.golang.org/grpc/metadata"
  13. "google.golang.org/grpc/status"
  14. )
  15. // CreateJWT func will used to create the JWT while signing in and signing out
  16. func SetJWT(client nodepb.NodeServiceClient, network string) (context.Context, error) {
  17. //home, err := os.UserHomeDir()
  18. home := "/etc/netclient"
  19. tokentext, err := ioutil.ReadFile(home + "/nettoken-" + network)
  20. if err != nil {
  21. err = AutoLogin(client, network)
  22. if err != nil {
  23. return nil, status.Errorf(codes.Unauthenticated, fmt.Sprintf("Something went wrong with Auto Login: %v", err))
  24. }
  25. tokentext, err = ioutil.ReadFile(home + "/nettoken-" + network)
  26. if err != nil {
  27. return nil, status.Errorf(codes.Unauthenticated, fmt.Sprintf("Something went wrong: %v", err))
  28. }
  29. }
  30. token := string(tokentext)
  31. // Anything linked to this variable will transmit request headers.
  32. md := metadata.New(map[string]string{"authorization": token})
  33. ctx := context.Background()
  34. ctx = metadata.NewOutgoingContext(ctx, md)
  35. return ctx, nil
  36. }
  37. func AutoLogin(client nodepb.NodeServiceClient, network string) error {
  38. //home, err := os.UserHomeDir()
  39. home := "/etc/netclient"
  40. //nodecfg := config.Config.Node
  41. cfg, err := config.ReadConfig(network)
  42. if err != nil {
  43. return err
  44. }
  45. pass, err := RetrieveSecret(network)
  46. if err != nil {
  47. return err
  48. }
  49. node := models.Node{
  50. Password: pass,
  51. MacAddress: cfg.Node.MacAddress,
  52. Network: network,
  53. }
  54. data, err := json.Marshal(&node)
  55. if err != nil {
  56. return nil
  57. }
  58. login := &nodepb.Object{
  59. Data: string(data),
  60. }
  61. // RPC call
  62. res, err := client.Login(context.TODO(), login)
  63. if err != nil {
  64. return err
  65. }
  66. tokenstring := []byte(res.Data)
  67. err = ioutil.WriteFile(home+"/nettoken-"+network, tokenstring, 0644)
  68. if err != nil {
  69. return err
  70. }
  71. return err
  72. }
  73. func StoreSecret(key string, network string) error {
  74. d1 := []byte(key)
  75. err := ioutil.WriteFile("/etc/netclient/secret-"+network, d1, 0644)
  76. return err
  77. }
  78. func RetrieveSecret(network string) (string, error) {
  79. dat, err := ioutil.ReadFile("/etc/netclient/secret-" + network)
  80. return string(dat), err
  81. }
  82. type Configuration struct {
  83. MacAddress string
  84. Password string
  85. }