Yes, ids are good.
def findByUserId(userId: Long)(implicit s: Session): Option[Token] =
tokens.filter(_.userId === userId).firstOption
findByUserId( user.id )
This allows the method to be used, even when the only thing you have is an id. Slick deliberately exposes the relational model (with a functional touch) and does not hide it, among other reasons because using id's instead of object references allows to refer to rows that are not loaded into memory merely by their id.
Or even better and simpler, because built into Slick:
val findByUserId = tokens.findBy(_.userId) // pre-compiles SQL for better performance
findByUserId(user.id).firstOption