Understanding glColorMaterial

As an excuse to learn OpenGL I wanted to create a program to plot in 3D the nested magnetic flux surfaces of our Stellarator experiment. So far I have been able to create and color them correctly. This is what it looks like without lighting.

The colors are important. They represent the strength of the magnetic field. I want to add some lighting so that the 3D structures are more distinct. I'm trying to use glColorMaterial to add some highlight on top of the colors. My code is

I have been playing around with it turning on and off various things. I have three conclusions.

1. glColorMaterial(GL_FRONT, GL_DIFFUSE) has no effect. If I set it up to have Diffuse light the only light all I get is black regardless of what value I set the light intensity too.

2. Using only specular light I get the color on the highlights and black everywhere else. This is what I would expect. When I turn on ambient the highlights become blown out. The light intensity appears to have no effect on how bright the model is.

3. Setting GL_FRONT or GL_BACK also seems to have no effect. I not sure if the vector in glnormal3d has to be normalized or not.

Am I using this correctly? I haven't found a tutorial on the web that really explains glColorMaterial aside from saying it's an alternative to setting glMaterial. Is there a way to control how bright the specular highlights are? Why aren't the diffuse lights working.

Also there's always some ambient light if you don't turn glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); to (0,0,0,1)

Also you usually keep the GL_SPECULAR value materials white (as specular light is intended to reflect light completely without the absorbing that causes colors to appear), so you don't call glColorMaterial(GL_FRONT_AND_BACK, GL_SPECULAR), keeping the specular component to the white default and not affected by glColor4d (you can still change it with glMaterialfv)

This may be beyond the scope of what you're doing, but in my experience, dropping glColor/glColorMaterial/etc in favor of GLSL and passing material properties as uniforms and attributes simplified my code greatly.