---
# System prepended metadata

title: Undefined method `time_zone` for PulseUser

---

# Undefined method `time_zone` for PulseUser

- No events in the past 24 hours.
- In the last 14 days only 3 URL routes report this exception.
  - /api/v1/media_items/??? (2,100+ events)
  - /mobile_devices/api/v1/device_locations (638 events)
  - /assets/nitro_theme/backgrounds/greyzz_@2X.png (9 events)

The last one is curious because the `/assets/` directory should [bypass the authentication completely](https://github.com/powerhome/nitro-web/blob/master/lib/middleware/ui_state_middleware.rb#L10).

The `media_items`route isn't used internally within Nitro, but within the mobile app.

The `api` routes both make use of component method `check_api_token_or_login` for authentication which is in the following components:

- accounting
- admin
- marketing
- media
- mobile_devices
- nitro_component_transition
- purchase_orders
- spaces

```ruby
    # If Authorization header present, api-token authentication is used.
    # If no Authorization header present, uses warden for auth.
    def check_api_token_or_login
      @key = request.headers["Authorization"]
      # token-based auth has a single param; multiple params are used by warden and unit test auth
      if @key.present? && @key.split.count == 1
        load_partner(api_key: @key)
      else
        authenticate!(:basic)
      end
    end
```

 For logging, dumping the entire `env["warden"]` object doesn't seem interesting alone.

```ruby
envv["warden"]
=> Warden::Proxy:200320 @config={:failure_app=>NitroAuth::WardenFailureApp, :default_scope=>:default, :scope_defaults=>{:mdm=>{:store=>false}}, :default_strategies=>{:_all=>[:password, :basic, :training], :customer=>[:pulse_user_auth_token], :mdm=>[:jwt]}, :intercept_401=>true}
```

Out of the full list of methods, I think these are the one's of primary interest when called on `env["warden"]`.

- `authenticated?` True if true.
- `result` Not sure what responses this may provide.
- `errors` but I don't think we're seeing any for this specific issue.
- `winning_strategy` tells us which actual strategy won out.
- `user` is already being used.
- `message` may be interesting but it was `nil` the times I checked it locally.

Note that where I placed the logging, most of these don't appear to be set at the point as they are typically blank.

## Once the pulse cookies are set, is `:customer` now a valid Nitro scope?

Looking at `Pulse::AuthStrategies::UserAuthToken`, it's considered a valid path if `request.cookies[Pulse::USER_AUTH_TOKEN_COOKIE]` is present. When using normal Nitro, if that cookie is set, does that allow this strategy to _win_ when we're not using Pulse?

When testing locally I wasn't seeing anything related to a customer scope in my logs, but when I tried to load a Pulse project, that set the cookies in my browser and even on Nitro pages, the `after_fetch` callback for `warden` started reporting that it was trying to use the `customer` scope and I was seeing `pulse_users` and `pulse_preferences` queries within the context of normal Nitro requests.

```
[request_id=b6a9202d-8b83-434e-bb26-68a67e22f3ee] [IP=::1] [U=1674] [user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36] [user_name=Kraig Schwerin] [territory_id=1] [territory=Philadelphia] [department_id=2] [department=Business Technology]   NitroAuth::AuthenticatedSession Load (2.5ms)  SELECT  `nitro_auth_authenticated_sessions`.* FROM `nitro_auth_authenticated_sessions` WHERE `nitro_auth_authenticated_sessions`.`id` = 13340299 LIMIT 1
[request_id=b6a9202d-8b83-434e-bb26-68a67e22f3ee] [IP=::1] [U=1674] [user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36] [user_name=Kraig Schwerin] [territory_id=1] [territory=Philadelphia] [department_id=2] [department=Business Technology]   Pulse::User Load (2.4ms)  SELECT  `pulse_users`.* FROM `pulse_users` WHERE `pulse_users`.`id` = 122265 LIMIT 1
```

Looking in `nitro_auth_authenticated_sessions` just attempting to load Pulse changed the `identify_type` to `Pulse::User`.

Loading Pulse appears to have created a NEW session id for me and switched over to that for both Nitro **and** Pulse in my browser.


## Added logging

To help find these, I added the following to my local logs and then just searched on `[Warden]`

Add these lines to the bottom of `components/nitro_auth/config/initializers/warden.rb`

```ruby
Warden::Manager.after_authentication do |user, auth, opts|
  Rails.logger.info "[WARDEN] after_authentication scope=#{opts[:scope]} #{user.class.to_s} winning_strategy=#{auth.winning_strategy} result=#{auth.result rescue nil} message=#{auth.message rescue nil} errors=#{auth.errors}"
end

Warden::Manager.after_fetch do |user, auth, opts|
  Rails.logger.info "[WARDEN] after_fetch scope=#{opts[:scope]} #{user.class.to_s} winning_strategy=#{auth.winning_strategy} result=#{auth.result rescue nil} message=#{auth.message rescue nil} errors=#{auth.errors}"
end
```

The `after_fetch` log entry was really where I was seeing the `PulseUser` details. I"m not sure why the `auth` object isn't showing the strategy/message/etc that are always empty, but we can see the behavior without them. How did I find out about using `after_fetch`? RTFD.


Change the `call` method in `lib/middleware/ui_state_middleware.rb` to the following which just adds the `Rails.logger.info` line.

```ruby
  def call(env)
    request = ActionDispatch::Request.new(env)
    unless env["PATH_INFO"].starts_with?(Rails.configuration.assets.prefix)
      Rails.logger.info "[WARDEN] UIStateMiddleware.call #{env["warden"].user.class.to_s} path=#{env["PATH_INFO"]} winning_strategy=#{env["warden"].winning_strategy} result=#{env["warden"].result rescue nil} message=#{env["warden"].message rescue nil} errors=#{env["warden"].errors}"
      env[:nitro_ui_state] = UIState.new(env["warden"].user, request)
    end
    @app.call(env)
  end
```