(w http.ResponseWriter, r *http.Request, userIDs *ttnpb.UserIdentifiers)
| 182 | } |
| 183 | |
| 184 | func (s *server) CreateUserSession(w http.ResponseWriter, r *http.Request, userIDs *ttnpb.UserIdentifiers) error { |
| 185 | ctx := r.Context() |
| 186 | tokenSecret, err := auth.GenerateKey(ctx) |
| 187 | if err != nil { |
| 188 | return err |
| 189 | } |
| 190 | hashedSecret, err := auth.Hash(auth.NewContextWithHashValidator(ctx, tokenHashSettings), tokenSecret) |
| 191 | if err != nil { |
| 192 | return err |
| 193 | } |
| 194 | newSession := &ttnpb.UserSession{ |
| 195 | UserIds: userIDs, |
| 196 | SessionSecret: hashedSecret, |
| 197 | } |
| 198 | if ttl := s.configFromContext(ctx).Login.SessionTTL; ttl > 0 { |
| 199 | newSession.ExpiresAt = timestamppb.New(time.Now().Add(ttl)) |
| 200 | } |
| 201 | var session *ttnpb.UserSession |
| 202 | err = s.store.Transact(ctx, func(ctx context.Context, st store.Interface) error { |
| 203 | session, err = st.CreateSession(ctx, newSession) |
| 204 | return err |
| 205 | }) |
| 206 | if err != nil { |
| 207 | return err |
| 208 | } |
| 209 | events.Publish(oauth.EvtUserLogin.NewWithIdentifiersAndData(ctx, userIDs, nil)) |
| 210 | return s.session.UpdateAuthCookie(w, r, func(cookie *auth.CookieShape) error { |
| 211 | cookie.UserID = session.GetUserIds().GetUserId() |
| 212 | cookie.SessionID = session.SessionId |
| 213 | cookie.SessionSecret = tokenSecret |
| 214 | return nil |
| 215 | }) |
| 216 | } |
| 217 | |
| 218 | func (s *server) Logout(w http.ResponseWriter, r *http.Request) { |
| 219 | r, session, err := s.session.Get(w, r) |
no test coverage detected