// NewContext returns a context carrying authentication information for the request. func (a *BasicAuth) NewContext(ctx context.Context, r *http.Request) context.Context { info := &Info{Username: a.CheckAuth(r), ResponseHeaders: make(http.Header)} info.Authenticated = (info.Username != "") if !info.Authenticated { info.ResponseHeaders.Set("WWW-Authenticate", `Basic realm="`+a.Realm+`"`) } return context.WithValue(ctx, infoKey, info) }
// NewContext returns a context carrying authentication information for the request. func (a *DigestAuth) NewContext(ctx context.Context, r *http.Request) context.Context { username, authinfo := a.CheckAuth(r) info := &Info{Username: username, ResponseHeaders: make(http.Header)} if username != "" { info.Authenticated = true info.ResponseHeaders.Set("Authentication-Info", *authinfo) } else { // return back digest WWW-Authenticate header if len(a.clients) > a.ClientCacheSize+a.ClientCacheTolerance { a.Purge(a.ClientCacheTolerance * 2) } nonce := RandomKey() a.clients[nonce] = &digest_client{nc: 0, last_seen: time.Now().UnixNano()} info.ResponseHeaders.Set("WWW-Authenticate", fmt.Sprintf(`Digest realm="%s", nonce="%s", opaque="%s", algorithm="MD5", qop="auth"`, a.Realm, nonce, a.Opaque)) } return context.WithValue(ctx, infoKey, info) }