"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 }