auth

Paddy 2014-09-01 Parent:1aa3a85ff853

28:75cf37088852 Go to Latest

auth/context.go.old

Rough out tokens and begin the memstore. Rough out the Token type for working with OAuth2 access and refresh tokens. Rough out the TokenStore interface that dictates how Tokens will be stored and retrieved. Write tests for the successful (in the working-as-intended sense) calls to TokenStore. Begin a Memstore type that stores data in memory. Implement the TokenStore interface for Memstore.

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