X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/a70f39f361c3c60018b90f02af64525534025e09..1ca3acc34896c8f1325925cb017c70bb23eac704:/sdk/go/auth/auth.go diff --git a/sdk/go/auth/auth.go b/sdk/go/auth/auth.go index 4a719e922d..ca4eb948b1 100644 --- a/sdk/go/auth/auth.go +++ b/sdk/go/auth/auth.go @@ -1,6 +1,7 @@ package auth import ( + "encoding/base64" "net/http" "net/url" "strings" @@ -20,6 +21,15 @@ func NewCredentialsFromHTTPRequest(r *http.Request) *Credentials { return c } +// EncodeTokenCookie accepts a token and returns a byte slice suitable +// for use as a cookie value, such that it will be decoded correctly +// by LoadTokensFromHTTPRequest. +var EncodeTokenCookie func([]byte) string = base64.URLEncoding.EncodeToString + +// DecodeTokenCookie accepts a cookie value and returns the encoded +// token. +var DecodeTokenCookie func(string) ([]byte, error) = base64.URLEncoding.DecodeString + // LoadTokensFromHttpRequest loads all tokens it can find in the // headers and query string of an http query. func (a *Credentials) LoadTokensFromHTTPRequest(r *http.Request) { @@ -51,10 +61,24 @@ func (a *Credentials) LoadTokensFromHTTPRequest(r *http.Request) { a.Tokens = append(a.Tokens, val...) } + a.loadTokenFromCookie(r) + // TODO: Load token from Rails session cookie (if Rails site // secret is known) } +func (a *Credentials) loadTokenFromCookie(r *http.Request) { + cookie, err := r.Cookie("arvados_api_token") + if err != nil || len(cookie.Value) == 0 { + return + } + token, err := DecodeTokenCookie(cookie.Value) + if err != nil { + return + } + a.Tokens = append(a.Tokens, string(token)) +} + // TODO: LoadTokensFromHttpRequestBody(). We can't assume in // LoadTokensFromHttpRequest() that [or how] we should read and parse // the request body. This has to be requested explicitly by the