mirror of
https://github.com/thomiceli/opengist.git
synced 2025-03-12 02:21:45 -05:00
85 lines
1.9 KiB
Go
85 lines
1.9 KiB
Go
package oauth
|
|
|
|
import (
|
|
gocontext "context"
|
|
"errors"
|
|
"github.com/markbates/goth"
|
|
"github.com/markbates/goth/gothic"
|
|
"github.com/markbates/goth/providers/openidConnect"
|
|
"github.com/thomiceli/opengist/internal/config"
|
|
"github.com/thomiceli/opengist/internal/db"
|
|
"github.com/thomiceli/opengist/internal/web/context"
|
|
)
|
|
|
|
type OIDCProvider struct {
|
|
Provider
|
|
URL string
|
|
}
|
|
|
|
func (p *OIDCProvider) RegisterProvider() error {
|
|
oidcProvider, err := openidConnect.New(
|
|
config.C.OIDCClientKey,
|
|
config.C.OIDCSecret,
|
|
urlJoin(p.URL, "/oauth/openid-connect/callback"),
|
|
config.C.OIDCDiscoveryUrl,
|
|
"openid",
|
|
"email",
|
|
"profile",
|
|
)
|
|
|
|
if err != nil {
|
|
return errors.New("Cannot create OIDC provider: " + err.Error())
|
|
}
|
|
|
|
goth.UseProviders(oidcProvider)
|
|
return nil
|
|
}
|
|
|
|
func (p *OIDCProvider) BeginAuthHandler(ctx *context.Context) {
|
|
ctxValue := gocontext.WithValue(ctx.Request().Context(), gothic.ProviderParamKey, OpenIDConnectString)
|
|
ctx.SetRequest(ctx.Request().WithContext(ctxValue))
|
|
|
|
gothic.BeginAuthHandler(ctx.Response(), ctx.Request())
|
|
}
|
|
|
|
func (p *OIDCProvider) UserHasProvider(user *db.User) bool {
|
|
return user.OIDCID != ""
|
|
}
|
|
|
|
func NewOIDCProvider(url string) *OIDCProvider {
|
|
return &OIDCProvider{
|
|
URL: url,
|
|
}
|
|
}
|
|
|
|
type OIDCCallbackProvider struct {
|
|
CallbackProvider
|
|
User *goth.User
|
|
}
|
|
|
|
func (p *OIDCCallbackProvider) GetProvider() string {
|
|
return OpenIDConnectString
|
|
}
|
|
|
|
func (p *OIDCCallbackProvider) GetProviderUser() *goth.User {
|
|
return p.User
|
|
}
|
|
|
|
func (p *OIDCCallbackProvider) GetProviderUserID(user *db.User) bool {
|
|
return user.OIDCID != ""
|
|
}
|
|
|
|
func (p *OIDCCallbackProvider) GetProviderUserSSHKeys() ([]string, error) {
|
|
return nil, nil
|
|
}
|
|
|
|
func (p *OIDCCallbackProvider) UpdateUserDB(user *db.User) {
|
|
user.OIDCID = p.User.UserID
|
|
user.AvatarURL = p.User.AvatarURL
|
|
}
|
|
|
|
func NewOIDCCallbackProvider(user *goth.User) CallbackProvider {
|
|
return &OIDCCallbackProvider{
|
|
User: user,
|
|
}
|
|
}
|