summaryrefslogtreecommitdiffstats
path: root/services/auth/source/oauth2/source_callout.go
diff options
context:
space:
mode:
Diffstat (limited to 'services/auth/source/oauth2/source_callout.go')
-rw-r--r--services/auth/source/oauth2/source_callout.go42
1 files changed, 42 insertions, 0 deletions
diff --git a/services/auth/source/oauth2/source_callout.go b/services/auth/source/oauth2/source_callout.go
new file mode 100644
index 0000000000..8f4663f3be
--- /dev/null
+++ b/services/auth/source/oauth2/source_callout.go
@@ -0,0 +1,42 @@
+// Copyright 2021 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package oauth2
+
+import (
+ "net/http"
+
+ "github.com/markbates/goth"
+ "github.com/markbates/goth/gothic"
+)
+
+// Callout redirects request/response pair to authenticate against the provider
+func (source *Source) Callout(request *http.Request, response http.ResponseWriter) error {
+ // not sure if goth is thread safe (?) when using multiple providers
+ request.Header.Set(ProviderHeaderKey, source.loginSource.Name)
+
+ // don't use the default gothic begin handler to prevent issues when some error occurs
+ // normally the gothic library will write some custom stuff to the response instead of our own nice error page
+ //gothic.BeginAuthHandler(response, request)
+
+ url, err := gothic.GetAuthURL(response, request)
+ if err == nil {
+ http.Redirect(response, request, url, http.StatusTemporaryRedirect)
+ }
+ return err
+}
+
+// Callback handles OAuth callback, resolve to a goth user and send back to original url
+// this will trigger a new authentication request, but because we save it in the session we can use that
+func (source *Source) Callback(request *http.Request, response http.ResponseWriter) (goth.User, error) {
+ // not sure if goth is thread safe (?) when using multiple providers
+ request.Header.Set(ProviderHeaderKey, source.loginSource.Name)
+
+ user, err := gothic.CompleteUserAuth(response, request)
+ if err != nil {
+ return user, err
+ }
+
+ return user, nil
+}