-
Notifications
You must be signed in to change notification settings - Fork 1
/
goagooglelogin.go
79 lines (66 loc) · 2.39 KB
/
goagooglelogin.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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package goagooglelogin
import (
"context"
"os"
jwt "github.com/dgrijalva/jwt-go"
"github.com/goadesign/goa"
"google.golang.org/api/oauth2/v2"
)
// CreateClaimFunction is GoaGloginConf.CreateClaim Type
type CreateClaimFunction func(
ctx context.Context,
googleUserID string,
userinfo *oauth2.Userinfoplus,
tokenInfo *oauth2.Tokeninfo,
) (jwt.Claims, error)
type (
// GoaGloginConf middleware config
GoaGloginConf struct {
LoginURL string // defualt: /login
CallbackURL string // default: /oauth2callback
StateSigned string // state JWT key
LoginSigned string // login JWT key
GoogleClientID string
GoogleClientSecret string
CreateClaims CreateClaimFunction
ExtensionIDs []string
}
)
var (
// DefaultGoaGloginConf is the default googlelogin middleware config.
DefaultGoaGloginConf = GoaGloginConf{
LoginURL: "/login",
CallbackURL: "/oauth2callback",
StateSigned: "f23oj3242jkl",
LoginSigned: "dqw324124123",
GoogleClientID: os.Getenv("OPENID_GOOGLE_CLIENT"),
GoogleClientSecret: os.Getenv("OPENID_GOOGLE_SECRET"),
CreateClaims: DefaultCreateClaims,
ExtensionIDs: []string{},
}
)
// GoaGLoginController implements the googlelogin resource.
type GoaGLoginController struct {
*goa.Controller
}
// newGoaGLoginController creates a goa google login controller.
func newGoaGLoginController(service *goa.Service) *GoaGLoginController {
return &GoaGLoginController{Controller: service.NewController("GoaGLoginController")}
}
// MountController is mount login&callback to service
func MountController(service *goa.Service) {
MountControllerWithConfig(service, nil)
}
// MountControllerWithConfig is mount login&callback to service(+config)
func MountControllerWithConfig(service *goa.Service, conf *GoaGloginConf) {
if conf == nil {
conf = &DefaultGoaGloginConf
}
ctrl := newGoaGLoginController(service)
// start url redirect to google
service.Mux.Handle("GET", conf.LoginURL, ctrl.MuxHandler("login", makeAuthHandler(service, conf), nil))
service.LogInfo("mount", "middleware", "goagooglelogin", "route", "GET "+conf.LoginURL)
// callback url and state check and get AccessToken
service.Mux.Handle("GET", conf.CallbackURL, ctrl.MuxHandler("callback", makeOauth2callbackHandler(service, conf), nil))
service.LogInfo("mount", "middleware", "goagooglelogin", "route", "GET "+conf.CallbackURL)
}