Шаг 1, изучаем
https://jwt.io/ - на настоящий момент стандарт для аутентификации.
Шаг 2. Каждое устройство должно иметь уникальный токен. Пользователь должен иметь возможность деавторизовать любое устройство. При смене пароля все токены автоматически стираются.
Организация хранения токена должна выглядеть примерно так:
tokens
- user_id
- device_id - при авторизации через браузер можно подставить md5(User-Agent)
- device_name - человеко-понятное имя девайса или название браузера
- token
- last_used
- expires_at
Про API, вместо передачи дополнительного параметра в запросе очень часто используют HTTP-заголовки.
Наличие множества токенов практически ничем не грозит, разве что небольшим увеличением размера данных.
Сброс токенов нужен по времени, по смене пароля, значительной смене географии (другая страна и т.п.), при нажатии кнопки Выход и по желанию пользователя (опции Выйти со всех устройств).