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.
66 lines
1.6 KiB
Go
66 lines
1.6 KiB
Go
// Copyright 2018 Drone.IO Inc. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package oauth1
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"git.awesome-for.me/liuzhiguo/go-login/login"
|
|
)
|
|
|
|
// Handler returns a Handler that runs h at the completion
|
|
// of the oauth2 authorization flow.
|
|
func Handler(h http.Handler, c *Config) http.Handler {
|
|
return &handler{next: h, conf: c}
|
|
}
|
|
|
|
type handler struct {
|
|
conf *Config
|
|
next http.Handler
|
|
}
|
|
|
|
func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
ctx := r.Context()
|
|
|
|
verifier := r.FormValue("oauth_verifier")
|
|
if verifier == "" {
|
|
token, err := h.conf.requestToken()
|
|
if err != nil {
|
|
ctx = login.WithError(ctx, err)
|
|
h.next.ServeHTTP(w, r.WithContext(ctx))
|
|
return
|
|
}
|
|
redirectTo, err := h.conf.authorizeRedirect(token.Token)
|
|
if err != nil {
|
|
ctx = login.WithError(ctx, err)
|
|
h.next.ServeHTTP(w, r.WithContext(ctx))
|
|
return
|
|
}
|
|
http.Redirect(w, r, redirectTo, 302)
|
|
return
|
|
}
|
|
|
|
token := r.FormValue("oauth_token")
|
|
|
|
// requests the access_token from the authorization server.
|
|
// If an error is encountered, write the error to the
|
|
// context and prceed with the next http.Handler in the chain.
|
|
accessToken, err := h.conf.authorizeToken(token, verifier)
|
|
if err != nil {
|
|
ctx = login.WithError(ctx, err)
|
|
h.next.ServeHTTP(w, r.WithContext(ctx))
|
|
return
|
|
}
|
|
|
|
// converts the oauth2 token type to the internal Token
|
|
// type and attaches to the context.
|
|
ctx = login.WithToken(ctx, &login.Token{
|
|
Access: accessToken.Token,
|
|
Refresh: accessToken.TokenSecret,
|
|
})
|
|
|
|
h.next.ServeHTTP(w, r.WithContext(ctx))
|
|
}
|