"Fossies" - the Fresh Open Source Software Archive

Member "gdrive-2.1.1/auth/oauth.go" (28 May 2021, 2439 Bytes) of package /linux/misc/gdrive-2.1.1.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Go source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 package auth
    2 
    3 import (
    4     "fmt"
    5     "golang.org/x/oauth2"
    6     "golang.org/x/oauth2/google"
    7     "net/http"
    8     "time"
    9 )
   10 
   11 type authCodeFn func(string) func() string
   12 
   13 func NewFileSourceClient(clientId, clientSecret, tokenFile string, authFn authCodeFn) (*http.Client, error) {
   14     conf := getConfig(clientId, clientSecret)
   15 
   16     // Read cached token
   17     token, exists, err := ReadToken(tokenFile)
   18     if err != nil {
   19         return nil, fmt.Errorf("Failed to read token: %s", err)
   20     }
   21 
   22     // Require auth code if token file does not exist
   23     // or refresh token is missing
   24     if !exists || token.RefreshToken == "" {
   25         authUrl := conf.AuthCodeURL("state", oauth2.AccessTypeOffline)
   26         authCode := authFn(authUrl)()
   27         token, err = conf.Exchange(oauth2.NoContext, authCode)
   28         if err != nil {
   29             return nil, fmt.Errorf("Failed to exchange auth code for token: %s", err)
   30         }
   31     }
   32 
   33     return oauth2.NewClient(
   34         oauth2.NoContext,
   35         FileSource(tokenFile, token, conf),
   36     ), nil
   37 }
   38 
   39 func NewRefreshTokenClient(clientId, clientSecret, refreshToken string) *http.Client {
   40     conf := getConfig(clientId, clientSecret)
   41 
   42     token := &oauth2.Token{
   43         TokenType:    "Bearer",
   44         RefreshToken: refreshToken,
   45         Expiry:       time.Now(),
   46     }
   47 
   48     return oauth2.NewClient(
   49         oauth2.NoContext,
   50         conf.TokenSource(oauth2.NoContext, token),
   51     )
   52 }
   53 
   54 func NewAccessTokenClient(clientId, clientSecret, accessToken string) *http.Client {
   55     conf := getConfig(clientId, clientSecret)
   56 
   57     token := &oauth2.Token{
   58         TokenType:   "Bearer",
   59         AccessToken: accessToken,
   60     }
   61 
   62     return oauth2.NewClient(
   63         oauth2.NoContext,
   64         conf.TokenSource(oauth2.NoContext, token),
   65     )
   66 }
   67 
   68 func NewServiceAccountClient(serviceAccountFile string) (*http.Client, error) {
   69     content, exists, err := ReadFile(serviceAccountFile)
   70     if(!exists) {
   71         return nil, fmt.Errorf("Service account filename %q not found", serviceAccountFile)
   72     }
   73 
   74     if(err != nil) {
   75         return nil, err
   76     }
   77 
   78     conf, err := google.JWTConfigFromJSON(content, "https://www.googleapis.com/auth/drive")
   79     if(err != nil) {
   80         return nil, err
   81     }
   82     return conf.Client(oauth2.NoContext), nil
   83 }
   84 
   85 func getConfig(clientId, clientSecret string) *oauth2.Config {
   86     return &oauth2.Config{
   87         ClientID:     clientId,
   88         ClientSecret: clientSecret,
   89         Scopes:       []string{"https://www.googleapis.com/auth/drive"},
   90         RedirectURL:  "urn:ietf:wg:oauth:2.0:oob",
   91         Endpoint: oauth2.Endpoint{
   92             AuthURL:  "https://accounts.google.com/o/oauth2/auth",
   93             TokenURL: "https://accounts.google.com/o/oauth2/token",
   94         },
   95     }
   96 }