OLD | NEW |
| (Empty) |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 package internal | |
6 | |
7 import ( | |
8 "fmt" | |
9 "time" | |
10 | |
11 "golang.org/x/net/context" | |
12 "golang.org/x/oauth2" | |
13 ) | |
14 | |
15 type userAuthTokenProvider struct { | |
16 oauthTokenProvider | |
17 | |
18 ctx context.Context | |
19 config *oauth2.Config | |
20 } | |
21 | |
22 // NewUserAuthTokenProvider returns TokenProvider that can perform 3-legged | |
23 // OAuth flow involving interaction with a user. | |
24 func NewUserAuthTokenProvider(ctx context.Context, clientID, clientSecret string
, scopes []string) (TokenProvider, error) { | |
25 return &userAuthTokenProvider{ | |
26 oauthTokenProvider: oauthTokenProvider{ | |
27 interactive: true, | |
28 tokenFlavor: "user", | |
29 }, | |
30 ctx: ctx, | |
31 config: &oauth2.Config{ | |
32 ClientID: clientID, | |
33 ClientSecret: clientSecret, | |
34 Endpoint: oauth2.Endpoint{ | |
35 AuthURL: "https://accounts.google.com/o/oauth2/
auth", | |
36 TokenURL: "https://accounts.google.com/o/oauth2/
token", | |
37 }, | |
38 RedirectURL: "urn:ietf:wg:oauth:2.0:oob", | |
39 Scopes: scopes, | |
40 }, | |
41 }, nil | |
42 } | |
43 | |
44 func (p *userAuthTokenProvider) MintToken() (Token, error) { | |
45 // Grab the authorization code by redirecting a user to a consent screen
. | |
46 url := p.config.AuthCodeURL("", oauth2.AccessTypeOffline, oauth2.Approva
lForce) | |
47 fmt.Printf("Visit the URL to get authorization code.\n\n%s\n\n", url) | |
48 fmt.Printf("Authorization code: ") | |
49 var code string | |
50 if _, err := fmt.Scan(&code); err != nil { | |
51 return nil, err | |
52 } | |
53 // Exchange it for a token. | |
54 tok, err := p.config.Exchange(p.ctx, code) | |
55 if err != nil { | |
56 return nil, err | |
57 } | |
58 return makeToken(tok), nil | |
59 } | |
60 | |
61 func (p *userAuthTokenProvider) RefreshToken(tok Token) (Token, error) { | |
62 // Clear expiration time to force token refresh. Do not use 0 since it m
eans | |
63 // that token never expires. | |
64 t := extractOAuthToken(tok) | |
65 t.Expiry = time.Unix(1, 0) | |
66 src := p.config.TokenSource(p.ctx, &t) | |
67 newTok, err := src.Token() | |
68 if err != nil { | |
69 return nil, err | |
70 } | |
71 return makeToken(newTok), nil | |
72 } | |
OLD | NEW |