Mam aplikację w Javie do której napisałem prosty mikroserwis w Node.js który działa jak REST API. Chciałbym to zabezpieczyć i wyczytałem, że do tego powinno się używać OAuth2 i tokenów, ale jak to ma działać? Muszę postawić własny serwer? Bo chyba używanie do tego FB albo Google mija się z celem. Zresztą to prosty serwis i tyle roboty, żeby go zabezpieczyć? I po każdym starcie apek będę musiał coś wpisywać, żeby sie autoryzować? A co jakbym chciał komuś innemu dać dostęp do tego API?
Co rozumiesz przez zabiezpieczyć? Jeśli potrzebujesz autoryzacji i szyfrowania to zacznij od Mutual TLS'a . To TLS z tą różnicą, że autentykacja odbywa się również po stronie serwera a nie tylko klienta. Wtedy jeśli chciałbyś komuś dać dostęp do serwera, to po prostu udostępniasz mu certyfikaty. Czy faktycznie potrzebujesz OAuth'a ciężko stwierdzić po Twoim poscie.
Btw z tego co wiem REST Api - opiera się na byciu "bezstanowym" (stateless) - https://en.wikipedia.org/wiki/Representational_state_transfer - czyli w API m.in nie ma sesji i każdy kontakt z serwerem powinien zawierać autentykację (o ile takowa jest potrzebna).
Nie napisałeś co te API ma robić, bo jeśli moze z niego korzystać każdy (publiczne api) - to po co CI zabezpieczenie i co ono miałoby Ci dać?
Jeśli jakiś Twój kod będzie klientem tego API - to tak - będziesz musiał się za każdym razem przedstawiać w jakiś sposób (np login + hasło), istnieją metody związane z tokenami tak jak pisałeś, ale czy Ty się nie porywasz z motyką na słońce? Może te zabepieczenie wcale nie jest Ci potrzebne aż tak. Btw czy Basic Auth
Ci nie wystarczy?
Jest to API ogłoszeń o pracę, ale nie dla każdego i chciałbym, żeby komunikacja między Node a Javą była w miarę zaszyfrowana a przede wszystkim, żeby nie każdy mógł pobrać listę ofert. Czyli np jak ktoś w Ruby chciałby się do tego podłączyć i pobierać oferty z API na Node to musiałby otrzymać ode mnie jakiś klucz. Na OAuth2 robiłem tylko autoryzacje przez Facebooka, ale to bez sensu i za każdym razem trzeba by wpisywać login i hasło. Chciałbym, żeby to działało tak, że komuś wystarczy tajny kod do pobrania i tyle.
Masz API - user X ma mieć dostęp do zasobu A, user Y do zasobu B.
Nieważne jest czy łączy się z ruby/php/gimbazjalnego-modyfikatora-frajdy :) - api ma udostępniać metody i tyle. Przykładowe żadanie może wyglądać tak (curl)
http://twoja.domena
-H 'authorization: Basic TUTAJPOLECIZAKODOWANEHASLO=' \
-H 'cache-control: no-cache' \
-d '{
"userCode":"X",
"userPassword":"hasloWmaslo"
}'```
Korzystasz z postmana?
Serwer swojego API masz napisany w javie czy nodzie? są na jednym serwerze?
Piszesz że chciałbyś, aby nie każdy miał możliwość pobierania czegoś - rozumiem że udostępniasz API dla wszystkich - więc musisz tylko zaimplementować jakiś mechanizm ACL (rbac/ czy cokolwiek)
Dzięki za pomoc.
Serwer jest w Node.js. Trafiłem na kilka stron i prawie wszędzie jest, żeby REST API zabezpieczać przez OAuth2.
4programmers[dot]net/Forum/Java/224877-rest_api_secure
owasp[dot]org/index.php/REST_Security_Cheat_Sheet
stormpath[dot]com/blog/secure-your-rest-api-right-way
Jest często np. coś takiego:
curl -X POST https://api.jakasdomena/authorize -d 'grant_type=client_credentials&app_id=1111111&app_secret=61e98c657baa5f5d7ca0a789e7d2adacdf1771e3bbca0643cef0921689eb48f4'
odpowiedź i token w takiej postaci:
{
"access_token":"3edb31532a5eade8fc2e2838ab79062ebf170798c7657b95d90c8c94f8dd033f",
"token_type":"bearer",
"expires_in":86400
}
a potem takie coś np. pobieranie użytkowników w postaci JSON:
curl -X GET https://api.jakasdomena/users -H "Authorization: Bearer 3edb31532a5eade8fc2e2838ab79062ebf170798c7657b95d90c8c94f8dd033f"
Analizując wiele takich REST-owych serwisów to często właśnie to tokenowe Bearer Authorization a nie Basic i np. PayU, czy nawet Facebook Graph API się na czymś takim opiera.