2019-07-31 18:34:27 -08:00
|
|
|
package webcontext
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
|
|
|
|
"github.com/gorilla/sessions"
|
|
|
|
)
|
|
|
|
|
|
|
|
// ctxKeySession represents the type of value for the context key.
|
|
|
|
type ctxKeySession int
|
|
|
|
|
|
|
|
// KeySession is used to store/retrieve a Session from a context.Context.
|
|
|
|
const KeySession ctxKeySession = 1
|
|
|
|
|
2019-08-03 15:01:17 -08:00
|
|
|
// KeyAccessToken is used to store the access token for the user in their session.
|
|
|
|
const KeyAccessToken = "AccessToken"
|
|
|
|
|
2019-07-31 18:34:27 -08:00
|
|
|
// ContextWithSession appends a universal translator to a context.
|
|
|
|
func ContextWithSession(ctx context.Context, session *sessions.Session) context.Context {
|
|
|
|
return context.WithValue(ctx, KeySession, session)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ContextSession returns the session from a context.
|
|
|
|
func ContextSession(ctx context.Context) *sessions.Session {
|
|
|
|
return ctx.Value(KeySession).(*sessions.Session)
|
|
|
|
}
|
|
|
|
|
|
|
|
func ContextAccessToken(ctx context.Context) (string, bool) {
|
|
|
|
session := ContextSession(ctx)
|
|
|
|
|
|
|
|
return SessionAccessToken(session)
|
|
|
|
}
|
|
|
|
|
|
|
|
func SessionAccessToken(session *sessions.Session) (string, bool) {
|
2019-08-03 15:01:17 -08:00
|
|
|
if sv, ok := session.Values[KeyAccessToken].(string); ok {
|
2019-07-31 18:34:27 -08:00
|
|
|
return sv, true
|
|
|
|
}
|
|
|
|
|
|
|
|
return "", false
|
|
|
|
}
|
|
|
|
|
|
|
|
func SessionWithAccessToken(session *sessions.Session, accessToken string) *sessions.Session {
|
|
|
|
|
|
|
|
if accessToken != "" {
|
2019-08-03 15:01:17 -08:00
|
|
|
session.Values[KeyAccessToken] = accessToken
|
2019-07-31 18:34:27 -08:00
|
|
|
} else {
|
2019-08-03 15:01:17 -08:00
|
|
|
delete(session.Values, KeyAccessToken)
|
2019-07-31 18:34:27 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
return session
|
|
|
|
}
|