/
provider.go
48 lines (38 loc) · 1.11 KB
/
provider.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package github
import (
"context"
"fmt"
"net/http"
"github.com/geisonbiazus/blog/internal/core/auth"
"golang.org/x/oauth2"
"golang.org/x/oauth2/github"
)
type Provider struct {
config oauth2.Config
}
func NewProvider(clientID, clientSecret string) *Provider {
config := oauth2.Config{
ClientID: clientID,
ClientSecret: clientSecret,
Endpoint: github.Endpoint,
}
return &Provider{config: config}
}
func (p *Provider) AuthURL(state string) string {
return p.config.AuthCodeURL(state)
}
func (p *Provider) AuthenticatedUser(ctx context.Context, code string) (auth.ProviderUser, error) {
httpClient, err := p.exchangeTokenAndGetClient(ctx, code)
if err != nil {
return auth.ProviderUser{}, err
}
return NewClient(httpClient).GetAuthenticatedUser()
}
func (p *Provider) exchangeTokenAndGetClient(ctx context.Context, code string) (*http.Client, error) {
token, err := p.config.Exchange(ctx, code)
if err != nil {
return nil, fmt.Errorf("error exchanging token on github.Provider: %w", err)
}
tokenSource := p.config.TokenSource(ctx, token)
return oauth2.NewClient(ctx, tokenSource), nil
}