client.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. // Oauth2 google api for Drive api
  2. package gdrivefs
  3. import (
  4. "context"
  5. "encoding/json"
  6. "fmt"
  7. "os"
  8. drive "google.golang.org/api/drive/v3"
  9. "dev.hexasoftware.com/hxs/cloudmount/internal/core"
  10. "golang.org/x/oauth2"
  11. )
  12. type ServiceConfig struct {
  13. ClientSecret struct {
  14. ClientID string `json:"client_id"`
  15. ClientSecret string `json:"client_secret"`
  16. RedirectURIs []string `json:"redirect_uris"`
  17. AuthURI string `json:"auth_uri"`
  18. TokenURI string `json:"token_uri"`
  19. } `json:"client_secret"`
  20. Auth *oauth2.Token `json:"auth"`
  21. /*struct {
  22. AccessToken string `json:"access_token"`
  23. TokenType string `json:"token_type"`
  24. RefreshToken string `json:"refresh_token"`
  25. Expiry string `json:"Expiry"`
  26. } `json:"auth"`*/
  27. }
  28. //func (d *GDriveFS) getClient(ctx context.Context, config *oauth2.Config) *http.Client {
  29. // cacheFile, err := d.tokenCacheFile()
  30. // if err != nil {
  31. /// log.Fatalf("Unable to get path to cached credential file. %v", err)
  32. // }
  33. /*if d.serviceConfig.Auth.AccessToken == "" {
  34. tok := getTokenFromWeb(config)
  35. d.serviceConfig.Auth = tok
  36. d.saveToken() // Save config actually
  37. }
  38. //tok, err := d.tokenFromFile(cacheFile)
  39. //if err != nil {
  40. // tok = d.getTokenFromWeb(config)
  41. // d.saveToken(cacheFile, tok)
  42. // }
  43. return config.Client(ctx, tok)
  44. //}
  45. /*func (d *GDriveFS) tokenCacheFile() (string, error) {
  46. tokenCacheDir := d.config.HomeDir
  47. err := os.MkdirAll(tokenCacheDir, 0700)
  48. return filepath.Join(tokenCacheDir, url.QueryEscape("auth.json")), err
  49. }*/
  50. func getTokenFromWeb(config *oauth2.Config) *oauth2.Token {
  51. authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline)
  52. fmt.Printf(
  53. `Go to the following link in your browser:
  54. ----------------------------------------------------------------------------------------------
  55. %v
  56. ----------------------------------------------------------------------------------------------
  57. type the authorization code: `, authURL)
  58. var code string
  59. if _, err := fmt.Scan(&code); err != nil {
  60. log.Fatalf("Unable to read authorization code %v", err)
  61. }
  62. tok, err := config.Exchange(oauth2.NoContext, code)
  63. if err != nil {
  64. log.Fatalf("Unable to retrieve token from web: %v", err)
  65. }
  66. return tok
  67. }
  68. /*func (d *GDriveFS) tokenFromFile(file string) (*oauth2.Token, error) {
  69. f, err := os.Open(file)
  70. if err != nil {
  71. return nil, err
  72. }
  73. defer f.Close()
  74. t := &oauth2.Token{}
  75. err = json.NewDecoder(f).Decode(t)
  76. return t, err
  77. }*/
  78. //func (d *GDriveFS) saveToken(file string, token *oauth2.Token) {
  79. /*func (d *GDriveFS) saveToken() { // Save credentials
  80. // Save token in SOURCE FILE
  81. log.Printf("Saving credential file to: %s\n", d.config.Source)
  82. f, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)
  83. if err != nil {
  84. log.Fatalf("Unable to cache oauth token: %v\n", err)
  85. }
  86. defer f.Close()
  87. json.NewEncoder(f).Encode(token)
  88. }*/
  89. func (d *GDriveFS) saveConfig() {
  90. data, err := json.MarshalIndent(d.serviceConfig, " ", " ")
  91. if err != nil {
  92. panic(err)
  93. }
  94. f, err := os.OpenFile(d.config.Source, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)
  95. if err != nil {
  96. log.Fatalf("Unable to cache oauth token: %v\n", err)
  97. }
  98. defer f.Close()
  99. f.Write(data)
  100. f.Sync()
  101. }
  102. // Init driveService
  103. func (d *GDriveFS) initClient() {
  104. //configPath := d.config.HomeDir
  105. ctx := context.Background() // Context from GDriveFS
  106. log.Println("Initializing gdrive service")
  107. log.Println("Source config:", d.config.Source)
  108. err := core.ParseConfig(d.config.Source, d.serviceConfig)
  109. //b, err := ioutil.ReadFile(d.config.Source)
  110. //b, err := ioutil.ReadFile(filepath.Join(configPath, "client_secret.json"))
  111. if err != nil {
  112. log.Fatalf("Unable to read client secret file: %v", err)
  113. }
  114. config := &oauth2.Config{
  115. ClientID: d.serviceConfig.ClientSecret.ClientID,
  116. ClientSecret: d.serviceConfig.ClientSecret.ClientSecret,
  117. RedirectURL: d.serviceConfig.ClientSecret.RedirectURIs[0],
  118. Scopes: []string{drive.DriveScope},
  119. Endpoint: oauth2.Endpoint{
  120. AuthURL: d.serviceConfig.ClientSecret.AuthURI,
  121. TokenURL: d.serviceConfig.ClientSecret.TokenURI,
  122. },
  123. }
  124. // We can deal with oauthToken here too
  125. if d.serviceConfig.Auth == nil {
  126. tok := getTokenFromWeb(config)
  127. d.serviceConfig.Auth = tok
  128. d.saveConfig()
  129. }
  130. /*config, err := google.ConfigFromJSON(b, drive.DriveScope)
  131. if err != nil {
  132. log.Fatalf("Unable to parse client secret file: %v", err)
  133. }*/
  134. client := config.Client(ctx, d.serviceConfig.Auth)
  135. d.client, err = drive.New(client)
  136. if err != nil {
  137. log.Fatalf("Unable to retrieve drive Client: %v", err)
  138. }
  139. }