Years ago, I wrote a post about how to place follicles on a surface for rigging in Maya. I no longer use this technique, and I don't recommend it anymore.
In Maya 2018, I started to experience flipping and jittering in the follicle node. Searching the web, I found that Vasil Shotarov had made some posts about a "Matrix Constraint". This uses basic Maya nodes to attach an object to the surface of another object.
I now use this technique all the time for my IK ribbons, surface following, etc.
I've written a PyMEL script for placing surface pins on a nurbsSurface, including a function which can place it as close as possible to a source object. This means that even if you don't know the UV coordinates you want, or if you want it to match the bones of your rig, you can just use the transform of those objects to determine where to place the "follicle".
I've posted the script and some examples of how to use it on Github.
(UPDATE: If you are fully upgraded to Maya 2020, it is worth checking out the proximityPin and uvPin nodes. On Twitter, @_illMill_ did some tests and found that node to be dramatically faster than follicles or matrix constraints. I'm personally supporting older versions of Maya, so I'm sticking with matrix constraints for now so I can keep backwards compatability.)
Feel free to use this script for your rigs. And if you want to dig deeper into the technicalities, or making it more efficient, definitely read Vasil's posts for a lot more detail.
(My next step will be to figure out how to support polygons. For now, it only works with Nurbs. Will Telford from Autodesk says that the proximityPin and uvPin nodes in Maya 2020 can support polygons.)