auth

Paddy 2014-08-16 Parent:9fe684b33b3d

22:e6a44cfda658 Go to Latest

auth/context.go

Redirect unauthenticated users to the login page. Redirect unauthenticated users to the login page, and encode the current URL in the redirect_to param so that the user returns to the OAuth2 flow after they log in.

History
paddy@6 1 package auth
paddy@0 2
paddy@10 3 import (
paddy@15 4 "encoding/json"
paddy@15 5 "html/template"
paddy@10 6 "io"
paddy@10 7 "log"
paddy@17 8 "net/http"
paddy@17 9
paddy@17 10 "github.com/justinas/nosurf"
paddy@10 11 )
paddy@1 12
paddy@0 13 type Context struct {
paddy@15 14 Config ServerConfig
paddy@15 15 Clients ClientStore
paddy@15 16 Tokens TokenStore
paddy@15 17 Profiles ProfileStore
paddy@19 18 Sessions SessionStore
paddy@15 19 Log *log.Logger
paddy@15 20 Templates Templates
paddy@15 21 }
paddy@15 22
paddy@15 23 type Templates struct {
paddy@15 24 Error *template.Template
paddy@15 25 Confirmation *template.Template
paddy@15 26 Login *template.Template
paddy@15 27 }
paddy@15 28
paddy@15 29 type jsonError struct {
paddy@15 30 Error string `json:"error,omitempty"`
paddy@15 31 Description string `json:"error_description,omitempty"`
paddy@15 32 URI string `json:"error_uri,omitempty"`
paddy@15 33 State string `json:"state,omitempty"`
paddy@0 34 }
paddy@1 35
paddy@1 36 func (c Context) RenderError(w io.Writer, err error) {
paddy@15 37 if c.Templates.Error == nil {
paddy@15 38 log.Println("Error template is nil, can't render error.")
paddy@15 39 return
paddy@15 40 }
paddy@15 41 renderErr := c.Templates.Error.Execute(w, map[string]interface{}{
paddy@15 42 "err": err,
paddy@15 43 })
paddy@15 44 if renderErr != nil {
paddy@15 45 log.Printf("Error executing error template (oh, the irony): %s\n", renderErr)
paddy@15 46 return
paddy@15 47 }
paddy@1 48 }
paddy@1 49
paddy@3 50 func (c Context) RenderJSONError(w io.Writer, code, description, baseURI string) {
paddy@15 51 d, err := json.Marshal(jsonError{
paddy@15 52 Error: code,
paddy@15 53 Description: description,
paddy@15 54 URI: baseURI,
paddy@15 55 })
paddy@15 56 if err != nil {
paddy@15 57 log.Printf("Error marshalling json error (oh, the irony): %s\n", err)
paddy@15 58 return
paddy@15 59 }
paddy@15 60 _, err = w.Write(d)
paddy@15 61 if err != nil {
paddy@15 62 log.Printf("Error writing json error: %s\n", err)
paddy@15 63 return
paddy@15 64 }
paddy@3 65 }
paddy@3 66
paddy@17 67 func (c Context) RenderConfirmation(w io.Writer, r *http.Request, req AuthRequest) {
paddy@15 68 if c.Templates.Confirmation == nil {
paddy@15 69 log.Println("Confirmation template is nil, can't render confirmation.")
paddy@15 70 return
paddy@15 71 }
paddy@17 72 err := c.Templates.Confirmation.Execute(w, map[string]interface{}{
paddy@17 73 "scope": req.Scope,
paddy@17 74 "client": req.Client,
paddy@17 75 "csrf_token": nosurf.Token(r),
paddy@17 76 })
paddy@15 77 if err != nil {
paddy@15 78 log.Printf("Error executing confirmation template: %s\n", err)
paddy@15 79 return
paddy@15 80 }
paddy@1 81 }
paddy@1 82
paddy@17 83 func (c Context) RenderLogin(w io.Writer, r *http.Request) {
paddy@15 84 if c.Templates.Login == nil {
paddy@15 85 log.Println("Login template is nil, can't render confirmation.")
paddy@15 86 return
paddy@15 87 }
paddy@17 88 err := c.Templates.Login.Execute(w, map[string]interface{}{
paddy@17 89 "csrf_token": nosurf.Token(r),
paddy@17 90 })
paddy@15 91 if err != nil {
paddy@15 92 log.Printf("Error executing login template: %s\n", err)
paddy@15 93 return
paddy@15 94 }
paddy@1 95 }
paddy@4 96
paddy@4 97 func (c Context) RenderJSONToken(w io.Writer, data AccessData) {
paddy@15 98 d, err := json.Marshal(data)
paddy@15 99 if err != nil {
paddy@15 100 log.Printf("Error marshalling json token: %s\n", err)
paddy@15 101 return
paddy@15 102 }
paddy@15 103 _, err = w.Write(d)
paddy@15 104 if err != nil {
paddy@15 105 log.Printf("Error writing json token: %s\n", err)
paddy@15 106 return
paddy@15 107 }
paddy@4 108 }