what is the best way ... ?
It depends on what you mean by "the best":
- The quickest to implement?
- The cheapest to implement?
- The easiest to integrate with Google or Facebook authentication?
- The easiest to integrate with clients own authentication system?
- A solution with the quickest way to revoke permissions?
- The most resistant to a particular attack type?
- The easiest for problem analysis and support?
- ...
Giving access based on some physical aspects (e.g. VPN connection, source IP) may be hard to implement and to maintain. That's why I'd suggest you to consider some authentication system based on user credentials, for instance, based on user/password (or depending on your context you may use client authentication based on user certificates, or based on user hardware like smartcard, or other).
Then you can implement authorization. Based on user (user name or some token), service should decide if particular request should be executed or not.
Without knowing particular context it is hard to suggest anything more specific.