@@ -102,6 +102,15 @@ func (h *TaskcafeHandler) LogoutHandler(w http.ResponseWriter, r *http.Request)
102102
103103// LoginHandler creates a new refresh & access token for the user if given the correct credentials
104104func (h * TaskcafeHandler ) LoginHandler (w http.ResponseWriter , r * http.Request ) {
105+ if h .SecurityConfig .IsExternalAuth {
106+ h .xHeaderAuthenticate (w , r )
107+ return
108+ }
109+
110+ h .credentialsHandler (w , r )
111+ }
112+
113+ func (h * TaskcafeHandler ) credentialsHandler (w http.ResponseWriter , r * http.Request ) {
105114 var requestData LoginRequestData
106115 err := json .NewDecoder (r .Body ).Decode (& requestData )
107116 if err != nil {
@@ -139,9 +148,47 @@ func (h *TaskcafeHandler) LoginHandler(w http.ResponseWriter, r *http.Request) {
139148 authCreatedAt := time .Now ().UTC ()
140149 authExpiresAt := authCreatedAt .AddDate (0 , 0 , 1 )
141150 authToken , err := h .repo .CreateAuthToken (r .Context (), db.CreateAuthTokenParams {user .UserID , authCreatedAt , authExpiresAt })
151+ if err != nil {
152+ w .WriteHeader (http .StatusInternalServerError )
153+ // TODO: should we return here?
154+ }
155+
156+ w .Header ().Set ("Content-type" , "application/json" )
157+ http .SetCookie (w , & http.Cookie {
158+ Name : "authToken" ,
159+ Value : authToken .TokenID .String (),
160+ Expires : authExpiresAt ,
161+ Path : "/" ,
162+ HttpOnly : true ,
163+ })
164+ json .NewEncoder (w ).Encode (LoginResponseData {Complete : true , UserID : authToken .UserID .String ()})
165+ }
142166
167+ func (h * TaskcafeHandler ) xHeaderAuthenticate (w http.ResponseWriter , r * http.Request ) {
168+ xRemoteUser := r .Header .Get ("X-Remote-User" )
169+ user , err := h .repo .GetUserAccountByUsername (r .Context (), xRemoteUser )
170+ if err != nil {
171+ log .WithFields (log.Fields {
172+ "username" : xRemoteUser ,
173+ }).Warn ("user account not found" )
174+ w .WriteHeader (http .StatusUnauthorized )
175+ return
176+ }
177+
178+ if ! user .Active {
179+ log .WithFields (log.Fields {
180+ "username" : user .Username ,
181+ }).Warn ("attempt to login with inactive user" )
182+ w .WriteHeader (http .StatusUnauthorized )
183+ return
184+ }
185+
186+ authCreatedAt := time .Now ().UTC ()
187+ authExpiresAt := authCreatedAt .AddDate (0 , 0 , 1 )
188+ authToken , err := h .repo .CreateAuthToken (r .Context (), db.CreateAuthTokenParams {user .UserID , authCreatedAt , authExpiresAt })
143189 if err != nil {
144190 w .WriteHeader (http .StatusInternalServerError )
191+ return
145192 }
146193
147194 w .Header ().Set ("Content-type" , "application/json" )
0 commit comments