1. You are right, this does not prevent unapproved customers.
2. Actually, this is not a way to prevent unauthorized clients; it is more about verifying that the message has not been tampered with by cable.
3. You understand oAuth correctly; this concerns client authentication for using your API in a certain way, as well as restriction of permissions.
It is not possible to block your API, so only a particular client can use it, because there is no way to check who the client is. In addition, any form of authentication or client-side authentication can ultimately be reconstructed and then sent to the server as an βapprovedβ client.
Something like this can be done with a token. The server sends the token to the client, the client performs a known operation on the token, such as salting and hashing, with a known salt and hash operation, and then returns the token to prove that the client is real.
The problem is that if someone calls the engineers of their client, they can determine what kind of operation it is, and then create their own client that authenticates the same. Any form of client-side authentication is not reliable and cannot be trusted.
In another way, it is broken if someone can request MiTM. The request could have been captured and modified before it reached the server, and there really is no way to prevent this other than using SSL, which could be corrupted with something like SSLStrip.
Any attempt to prevent an unapproved client is basically security through the unknown , as there is no reliable way to do what you ask.
The best way to protect your API is not to restrict which clients can access it, but to make it safe. Best practice includes forced SSL, just send the password once and then use tokens for authentication, etc.