From bea497ff96f4deae617e54468576d11d105e2125 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Mon, 2 Mar 2020 22:11:45 -0500 Subject: [PATCH] nextcloud oauth (#10562) Fix #7078 --- models/oauth2.go | 14 +- modules/auth/oauth2/oauth2.go | 23 ++ options/locale/locale_en-US.ini | 1 + public/img/auth/nextcloud.png | Bin 0 -> 2918 bytes templates/admin/auth/new.tmpl | 2 + .../goth/providers/nextcloud/README.md | 85 +++++++ .../goth/providers/nextcloud/nextcloud.go | 208 ++++++++++++++++++ .../providers/nextcloud/nextcloud_setup.png | Bin 0 -> 85944 bytes .../goth/providers/nextcloud/session.go | 63 ++++++ vendor/modules.txt | 1 + web_src/js/index.js | 2 + 11 files changed, 396 insertions(+), 3 deletions(-) create mode 100644 public/img/auth/nextcloud.png create mode 100644 vendor/github.com/markbates/goth/providers/nextcloud/README.md create mode 100644 vendor/github.com/markbates/goth/providers/nextcloud/nextcloud.go create mode 100644 vendor/github.com/markbates/goth/providers/nextcloud/nextcloud_setup.png create mode 100644 vendor/github.com/markbates/goth/providers/nextcloud/session.go diff --git a/models/oauth2.go b/models/oauth2.go index ee3ea4b92..8164699d8 100644 --- a/models/oauth2.go +++ b/models/oauth2.go @@ -51,15 +51,23 @@ var OAuth2Providers = map[string]OAuth2Provider{ ProfileURL: oauth2.GetDefaultProfileURL("gitea"), }, }, + "nextcloud": {Name: "nextcloud", DisplayName: "Nextcloud", Image: "/img/auth/nextcloud.png", + CustomURLMapping: &oauth2.CustomURLMapping{ + TokenURL: oauth2.GetDefaultTokenURL("nextcloud"), + AuthURL: oauth2.GetDefaultAuthURL("nextcloud"), + ProfileURL: oauth2.GetDefaultProfileURL("nextcloud"), + }, + }, } // OAuth2DefaultCustomURLMappings contains the map of default URL's for OAuth2 providers that are allowed to have custom urls // key is used to map the OAuth2Provider // value is the mapping as defined for the OAuth2Provider var OAuth2DefaultCustomURLMappings = map[string]*oauth2.CustomURLMapping{ - "github": OAuth2Providers["github"].CustomURLMapping, - "gitlab": OAuth2Providers["gitlab"].CustomURLMapping, - "gitea": OAuth2Providers["gitea"].CustomURLMapping, + "github": OAuth2Providers["github"].CustomURLMapping, + "gitlab": OAuth2Providers["gitlab"].CustomURLMapping, + "gitea": OAuth2Providers["gitea"].CustomURLMapping, + "nextcloud": OAuth2Providers["nextcloud"].CustomURLMapping, } // GetActiveOAuth2ProviderLoginSources returns all actived LoginOAuth2 sources diff --git a/modules/auth/oauth2/oauth2.go b/modules/auth/oauth2/oauth2.go index 20dfb15e8..193a87c4e 100644 --- a/modules/auth/oauth2/oauth2.go +++ b/modules/auth/oauth2/oauth2.go @@ -22,6 +22,7 @@ import ( "github.com/markbates/goth/providers/github" "github.com/markbates/goth/providers/gitlab" "github.com/markbates/goth/providers/google" + "github.com/markbates/goth/providers/nextcloud" "github.com/markbates/goth/providers/openidConnect" "github.com/markbates/goth/providers/twitter" "github.com/satori/go.uuid" @@ -192,6 +193,22 @@ func createProvider(providerName, providerType, clientID, clientSecret, openIDCo } } provider = gitea.NewCustomisedURL(clientID, clientSecret, callbackURL, authURL, tokenURL, profileURL) + case "nextcloud": + authURL := nextcloud.AuthURL + tokenURL := nextcloud.TokenURL + profileURL := nextcloud.ProfileURL + if customURLMapping != nil { + if len(customURLMapping.AuthURL) > 0 { + authURL = customURLMapping.AuthURL + } + if len(customURLMapping.TokenURL) > 0 { + tokenURL = customURLMapping.TokenURL + } + if len(customURLMapping.ProfileURL) > 0 { + profileURL = customURLMapping.ProfileURL + } + } + provider = nextcloud.NewCustomisedURL(clientID, clientSecret, callbackURL, authURL, tokenURL, profileURL) } // always set the name if provider is created so we can support multiple setups of 1 provider @@ -211,6 +228,8 @@ func GetDefaultTokenURL(provider string) string { return gitlab.TokenURL case "gitea": return gitea.TokenURL + case "nextcloud": + return nextcloud.TokenURL } return "" } @@ -224,6 +243,8 @@ func GetDefaultAuthURL(provider string) string { return gitlab.AuthURL case "gitea": return gitea.AuthURL + case "nextcloud": + return nextcloud.AuthURL } return "" } @@ -237,6 +258,8 @@ func GetDefaultProfileURL(provider string) string { return gitlab.ProfileURL case "gitea": return gitea.ProfileURL + case "nextcloud": + return nextcloud.ProfileURL } return "" } diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index be478ad44..90abac6f1 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1927,6 +1927,7 @@ auths.tips.oauth2.general = OAuth2 Authentication auths.tips.oauth2.general.tip = When registering a new OAuth2 authentication, the callback/redirect URL should be: /user/oauth2//callback auths.tip.oauth2_provider = OAuth2 Provider auths.tip.bitbucket = Register a new OAuth consumer on https://bitbucket.org/account/user//oauth-consumers/new and add the permission 'Account' - 'Read' +auths.tip.nextcloud = Register a new OAuth consumer on your instance using the following menu "Settings -> Security -> OAuth 2.0 client" auths.tip.dropbox = Create a new application at https://www.dropbox.com/developers/apps auths.tip.facebook = Register a new application at https://developers.facebook.com/apps and add the product "Facebook Login" auths.tip.github = Register a new OAuth application on https://github.com/settings/applications/new diff --git a/public/img/auth/nextcloud.png b/public/img/auth/nextcloud.png new file mode 100644 index 0000000000000000000000000000000000000000..635806813a61c2eed5e7c91b3e547ce5107aabb3 GIT binary patch literal 2918 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 p>I~$upV)DCPa&2hXIV5u+o??M(2c&|cXG{{.i18n.Tr "admin.auths.tip.discord"}}
  • Gitea
  • {{.i18n.Tr "admin.auths.tip.gitea"}} +
  • Nextcloud
  • + {{.i18n.Tr "admin.auths.tip.nextcloud"}} diff --git a/vendor/github.com/markbates/goth/providers/nextcloud/README.md b/vendor/github.com/markbates/goth/providers/nextcloud/README.md new file mode 100644 index 000000000..3047934eb --- /dev/null +++ b/vendor/github.com/markbates/goth/providers/nextcloud/README.md @@ -0,0 +1,85 @@ +# Nextcloud OAuth2 + +For this backend, you need to have an OAuth2 enabled Nextcloud Instance, e.g. +on your own private server. + +## Setting up Nextcloud Test Environment + +To test, you only need a working Docker image of Nextcloud running on a public +URL, e.g. through [traefik](https://traefik.io/) + +```docker-compose.yml +version: '2' + +networks: + traefik-web: + external: true + +services: + app: + image: nextcloud + restart: always + networks: + - traefik-web + labels: + - traefik.enable=true + - traefik.frontend.rule=Host:${NEXTCLOUD_DNS} + - traefik.docker.network=traefik-web + environment: + SQLITE_DATABASE: "database.sqlite3" + NEXTCLOUD_ADMIN_USER: admin + NEXTCLOUD_ADMIN_PASSWORD: admin + NEXTCLOUD_TRUSTED_DOMAINS: ${NEXTCLOUD_DNS} +``` + +and start it up via + +``` +NEXTCLOUD_DNS=goth.my.server.name docker-compose up -d +``` + +afterwards, you will have a running Nextcloud instance with credentials + +``` +admin / admin +``` + +Then add a new OAuth 2.0 Client by going to + +``` +Settings -> Security -> OAuth 2.0 client +``` + +![Nextcloud Setup](nextcloud_setup.png) + +and add a new client with the name `goth` and redirection uri `http://localhost:3000/auth/nextcloud/callback`. The imporant part here the +two cryptic entries `Client Identifier` and `Secret`, which needs to be +used in your application. + +## Running Login Example + +If you want to run the default example in `/examples`, you have to +retrieve the keys described in the previous section and run the example +as follows: + +``` +NEXTCLOUD_URL=https://goth.my.server.name \ +NEXTCLOUD_KEY= \ +NEXTCLOUD_SECRET= \ +SESSION_SECRET=1 \ +./examples +``` + +Afterwards, you should be able to login via Nextcloud in the examples app. + +## Running the Provider Test + +The test has the same arguments as the login example test, but starts the test itself + +``` +NEXTCLOUD_URL=https://goth.my.server.name \ +NEXTCLOUD_KEY= \ +NEXTCLOUD_SECRET= \ +SESSION_SECRET=1 \ +go test -v +``` diff --git a/vendor/github.com/markbates/goth/providers/nextcloud/nextcloud.go b/vendor/github.com/markbates/goth/providers/nextcloud/nextcloud.go new file mode 100644 index 000000000..df64de71f --- /dev/null +++ b/vendor/github.com/markbates/goth/providers/nextcloud/nextcloud.go @@ -0,0 +1,208 @@ +// Package nextcloud implements the OAuth2 protocol for authenticating users through nextcloud. +// This package can be used as a reference implementation of an OAuth2 provider for Goth. +package nextcloud + +import ( + "bytes" + "encoding/json" + "io" + "io/ioutil" + "net/http" + + "fmt" + + "github.com/markbates/goth" + "golang.org/x/oauth2" +) + +// These vars define the Authentication, Token, and Profile URLS for Nextcloud. +// You have to set these values to something useful, because nextcloud is always +// hosted somewhere. +// +var ( + AuthURL = "https:///apps/oauth2/authorize" + TokenURL = "https:///apps/oauth2/api/v1/token" + ProfileURL = "https:///ocs/v2.php/cloud/user?format=json" +) + +// Provider is the implementation of `goth.Provider` for accessing Nextcloud. +type Provider struct { + ClientKey string + Secret string + CallbackURL string + HTTPClient *http.Client + config *oauth2.Config + providerName string + authURL string + tokenURL string + profileURL string +} + +// New is only here to fulfill the interface requirements and does not work properly without +// setting your own Nextcloud connect parameters, more precisely AuthURL, TokenURL and ProfileURL. +// Please use NewCustomisedDNS with the beginning of your URL or NewCustomiseURL. +func New(clientKey, secret, callbackURL string, scopes ...string) *Provider { + return NewCustomisedURL(clientKey, secret, callbackURL, AuthURL, TokenURL, ProfileURL, scopes...) +} + +// NewCustomisedURL create a working connection to your Nextcloud server given by the values +// authURL, tokenURL and profileURL. +// If you want to use a simpler method, please have a look at NewCustomisedDNS, which gets only +// on parameter instead of three. +func NewCustomisedURL(clientKey, secret, callbackURL, authURL, tokenURL, profileURL string, scopes ...string) *Provider { + p := &Provider{ + ClientKey: clientKey, + Secret: secret, + CallbackURL: callbackURL, + providerName: "nextcloud", + profileURL: profileURL, + } + p.config = newConfig(p, authURL, tokenURL, scopes) + return p +} + +// NewCustomisedDNS is the simplest method to create a provider based only on your key/secret +// and the beginning of the URL to your server, e.g. https://my.server.name/ +func NewCustomisedDNS(clientKey, secret, callbackURL, nextcloudURL string, scopes ...string) *Provider { + return NewCustomisedURL( + clientKey, + secret, + callbackURL, + nextcloudURL+"/apps/oauth2/authorize", + nextcloudURL+"/apps/oauth2/api/v1/token", + nextcloudURL+"/ocs/v2.php/cloud/user?format=json", + scopes..., + ) +} + +// Name is the name used to retrieve this provider later. +func (p *Provider) Name() string { + return p.providerName +} + +// SetName is to update the name of the provider (needed in case of multiple providers of 1 type) +func (p *Provider) SetName(name string) { + p.providerName = name +} + +func (p *Provider) Client() *http.Client { + return goth.HTTPClientWithFallBack(p.HTTPClient) +} + +// Debug is a no-op for the nextcloud package. +func (p *Provider) Debug(debug bool) {} + +// BeginAuth asks Nextcloud for an authentication end-point. +func (p *Provider) BeginAuth(state string) (goth.Session, error) { + return &Session{ + AuthURL: p.config.AuthCodeURL(state), + }, nil +} + +// FetchUser will go to Nextcloud and access basic information about the user. +func (p *Provider) FetchUser(session goth.Session) (goth.User, error) { + sess := session.(*Session) + user := goth.User{ + AccessToken: sess.AccessToken, + Provider: p.Name(), + RefreshToken: sess.RefreshToken, + ExpiresAt: sess.ExpiresAt, + } + + if user.AccessToken == "" { + // data is not yet retrieved since accessToken is still empty + return user, fmt.Errorf("%s cannot get user information without accessToken", p.providerName) + } + + req, err := http.NewRequest("GET", p.profileURL, nil) + if err != nil { + return user, err + } + req.Header.Set("Authorization", "Bearer "+sess.AccessToken) + response, err := p.Client().Do(req) + + if err != nil { + if response != nil { + response.Body.Close() + } + return user, err + } + + defer response.Body.Close() + + if response.StatusCode != http.StatusOK { + return user, fmt.Errorf("%s responded with a %d trying to fetch user information", p.providerName, response.StatusCode) + } + + bits, err := ioutil.ReadAll(response.Body) + if err != nil { + return user, err + } + + err = json.NewDecoder(bytes.NewReader(bits)).Decode(&user.RawData) + if err != nil { + return user, err + } + + err = userFromReader(bytes.NewReader(bits), &user) + + return user, err +} + +func newConfig(provider *Provider, authURL, tokenURL string, scopes []string) *oauth2.Config { + c := &oauth2.Config{ + ClientID: provider.ClientKey, + ClientSecret: provider.Secret, + RedirectURL: provider.CallbackURL, + Endpoint: oauth2.Endpoint{ + AuthURL: authURL, + TokenURL: tokenURL, + }, + Scopes: []string{}, + } + + if len(scopes) > 0 { + for _, scope := range scopes { + c.Scopes = append(c.Scopes, scope) + } + } + return c +} + +func userFromReader(r io.Reader, user *goth.User) error { + u := struct { + Ocs struct { + Data struct { + EMail string `json:"email"` + DisplayName string `json:"display-name"` + ID string `json:"id"` + Address string `json:"address"` + } + } `json:"ocs"` + }{} + err := json.NewDecoder(r).Decode(&u) + if err != nil { + return err + } + user.Email = u.Ocs.Data.EMail + user.Name = u.Ocs.Data.DisplayName + user.UserID = u.Ocs.Data.ID + user.Location = u.Ocs.Data.Address + return nil +} + +//RefreshTokenAvailable refresh token is provided by auth provider or not +func (p *Provider) RefreshTokenAvailable() bool { + return true +} + +//RefreshToken get new access token based on the refresh token +func (p *Provider) RefreshToken(refreshToken string) (*oauth2.Token, error) { + token := &oauth2.Token{RefreshToken: refreshToken} + ts := p.config.TokenSource(goth.ContextForClient(p.Client()), token) + newToken, err := ts.Token() + if err != nil { + return nil, err + } + return newToken, err +} diff --git a/vendor/github.com/markbates/goth/providers/nextcloud/nextcloud_setup.png b/vendor/github.com/markbates/goth/providers/nextcloud/nextcloud_setup.png new file mode 100644 index 0000000000000000000000000000000000000000..8f457dd2a31650fd33e44126db684aaf847c92c4 GIT binary patch literal 85944 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 z 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 Q;ea1`X=SN$38R4j17;<;Z2$lO literal 0 HcmV?d00001 diff --git a/vendor/github.com/markbates/goth/providers/nextcloud/session.go b/vendor/github.com/markbates/goth/providers/nextcloud/session.go new file mode 100644 index 000000000..568f3d6d4 --- /dev/null +++ b/vendor/github.com/markbates/goth/providers/nextcloud/session.go @@ -0,0 +1,63 @@ +package nextcloud + +import ( + "encoding/json" + "errors" + "strings" + "time" + + "github.com/markbates/goth" +) + +// Session stores data during the auth process with Nextcloud. +type Session struct { + AuthURL string + AccessToken string + RefreshToken string + ExpiresAt time.Time +} + +var _ goth.Session = &Session{} + +// GetAuthURL will return the URL set by calling the `BeginAuth` function on the Nextcloud provider. +func (s Session) GetAuthURL() (string, error) { + if s.AuthURL == "" { + return "", errors.New(goth.NoAuthUrlErrorMessage) + } + return s.AuthURL, nil +} + +// Authorize the session with Nextcloud and return the access token to be stored for future use. +func (s *Session) Authorize(provider goth.Provider, params goth.Params) (string, error) { + p := provider.(*Provider) + token, err := p.config.Exchange(goth.ContextForClient(p.Client()), params.Get("code")) + if err != nil { + return "", err + } + + if !token.Valid() { + return "", errors.New("Invalid token received from provider") + } + + s.AccessToken = token.AccessToken + s.RefreshToken = token.RefreshToken + s.ExpiresAt = token.Expiry + return token.AccessToken, err +} + +// Marshal the session into a string +func (s Session) Marshal() string { + b, _ := json.Marshal(s) + return string(b) +} + +func (s Session) String() string { + return s.Marshal() +} + +// UnmarshalSession wil unmarshal a JSON string into a session. +func (p *Provider) UnmarshalSession(data string) (goth.Session, error) { + s := &Session{} + err := json.NewDecoder(strings.NewReader(data)).Decode(s) + return s, err +} diff --git a/vendor/modules.txt b/vendor/modules.txt index e26566e59..80f3b6ac0 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -311,6 +311,7 @@ github.com/markbates/goth/providers/gitea github.com/markbates/goth/providers/github github.com/markbates/goth/providers/gitlab github.com/markbates/goth/providers/google +github.com/markbates/goth/providers/nextcloud github.com/markbates/goth/providers/openidConnect github.com/markbates/goth/providers/twitter # github.com/mattn/go-isatty v0.0.7 diff --git a/web_src/js/index.js b/web_src/js/index.js index fcf9701c3..b2eec525d 100644 --- a/web_src/js/index.js +++ b/web_src/js/index.js @@ -1892,6 +1892,7 @@ function initAdmin() { case 'github': case 'gitlab': case 'gitea': + case 'nextcloud': $('.oauth2_use_custom_url').show(); break; case 'openidConnect': @@ -1925,6 +1926,7 @@ function initAdmin() { $('.oauth2_token_url input, .oauth2_auth_url input, .oauth2_profile_url input, .oauth2_email_url input').attr('required', 'required'); $('.oauth2_token_url, .oauth2_auth_url, .oauth2_profile_url, .oauth2_email_url').show(); break; + case 'nextcloud': case 'gitea': case 'gitlab': $('.oauth2_token_url input, .oauth2_auth_url input, .oauth2_profile_url input').attr('required', 'required');