mirror of https://github.com/synctv-org/synctv
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.2 KiB
Go
85 lines
2.2 KiB
Go
2 years ago
|
package plugins
|
||
2 years ago
|
|
||
|
import (
|
||
|
"context"
|
||
|
"time"
|
||
|
|
||
2 years ago
|
"github.com/synctv-org/synctv/internal/provider"
|
||
2 years ago
|
providerpb "github.com/synctv-org/synctv/proto/provider"
|
||
|
"golang.org/x/oauth2"
|
||
|
)
|
||
|
|
||
|
type GRPCClient struct{ client providerpb.Oauth2PluginClient }
|
||
|
|
||
2 years ago
|
var _ provider.ProviderInterface = (*GRPCClient)(nil)
|
||
2 years ago
|
|
||
2 years ago
|
func (c *GRPCClient) Init(o provider.Oauth2Option) {
|
||
2 years ago
|
c.client.Init(context.Background(), &providerpb.InitReq{
|
||
|
ClientId: o.ClientID,
|
||
|
ClientSecret: o.ClientSecret,
|
||
|
RedirectUrl: o.RedirectURL,
|
||
|
})
|
||
|
}
|
||
|
|
||
2 years ago
|
func (c *GRPCClient) Provider() provider.OAuth2Provider {
|
||
2 years ago
|
resp, err := c.client.Provider(context.Background(), &providerpb.Enpty{})
|
||
|
if err != nil {
|
||
|
return ""
|
||
|
}
|
||
2 years ago
|
return provider.OAuth2Provider(resp.Name)
|
||
2 years ago
|
}
|
||
|
|
||
|
func (c *GRPCClient) NewAuthURL(state string) string {
|
||
|
resp, err := c.client.NewAuthURL(context.Background(), &providerpb.NewAuthURLReq{State: state})
|
||
|
if err != nil {
|
||
|
return ""
|
||
|
}
|
||
|
return resp.Url
|
||
|
}
|
||
|
|
||
|
func (c *GRPCClient) GetToken(ctx context.Context, code string) (*oauth2.Token, error) {
|
||
|
resp, err := c.client.GetToken(ctx, &providerpb.GetTokenReq{Code: code})
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return &oauth2.Token{
|
||
|
AccessToken: resp.AccessToken,
|
||
|
TokenType: resp.TokenType,
|
||
|
RefreshToken: resp.RefreshToken,
|
||
|
Expiry: time.Unix(resp.Expiry, 0),
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
2 years ago
|
func (c *GRPCClient) RefreshToken(ctx context.Context, tk string) (*oauth2.Token, error) {
|
||
|
resp, err := c.client.RefreshToken(ctx, &providerpb.RefreshTokenReq{
|
||
|
RefreshToken: tk,
|
||
|
})
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return &oauth2.Token{
|
||
|
AccessToken: resp.Token.AccessToken,
|
||
|
TokenType: resp.Token.TokenType,
|
||
|
RefreshToken: resp.Token.RefreshToken,
|
||
|
Expiry: time.Unix(resp.Token.Expiry, 0),
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
2 years ago
|
func (c *GRPCClient) GetUserInfo(ctx context.Context, tk *oauth2.Token) (*provider.UserInfo, error) {
|
||
2 years ago
|
resp, err := c.client.GetUserInfo(ctx, &providerpb.GetUserInfoReq{
|
||
|
Token: &providerpb.Token{
|
||
|
AccessToken: tk.AccessToken,
|
||
|
TokenType: tk.TokenType,
|
||
|
RefreshToken: tk.RefreshToken,
|
||
|
Expiry: tk.Expiry.Unix(),
|
||
|
},
|
||
|
})
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
2 years ago
|
return &provider.UserInfo{
|
||
2 years ago
|
Username: resp.Username,
|
||
|
ProviderUserID: uint(resp.ProviderUserId),
|
||
|
}, nil
|
||
|
}
|