Zabezpieczanie interfejsu API za pomocą protokołu OAuth

Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
info

Czego się nauczysz

  • Pobierz i wdróż przykładowy proxy interfejsu API.
  • Utwórz proxy interfejsu API chronione przez OAuth.
  • Utwórz produkt, programistę i aplikację.
  • Wymiana danych logowania na token dostępu OAuth.
  • Wywołaj interfejs API za pomocą tokena dostępu.

Z tego samouczka dowiesz się, jak zabezpieczyć interfejs API za pomocą OAuth 2.0.

OAuth to protokół autoryzacji, który umożliwia aplikacjom dostęp do informacji w imieniu użytkowników bez konieczności ujawniania przez nich nazwy użytkownika i hasła.

W przypadku OAuth dane logowania (np. nazwa użytkownika i hasło lub klucz i tajny klucz) są wymieniane na token dostępu. Na przykład:

joe:joes_password (nazwa użytkownika:hasło) lub
Nf2moHOASMJeUmXVdDhlMbPaXm2U7eMc:unUOXYpPe74ZfLEb (klucz:tajny)

zmienia się w:

b0uiYwjRZLEo4lEu7ky2GGxHkanN

Token dostępu to losowy ciąg znaków, który jest tymczasowy (powinien wygasnąć po stosunkowo krótkim czasie), więc przekazywanie go w celu uwierzytelnienia użytkownika w przepływie pracy aplikacji jest znacznie bezpieczniejsze niż przekazywanie rzeczywistych danych logowania.

Specyfikacja OAuth 2.0 definiuje różne mechanizmy, zwane „typami uprawnień”, służące do dystrybucji tokenów dostępu dla aplikacji. Najbardziej podstawowy typ uwierzytelnienia zdefiniowany przez OAuth 2.0 to „dane uwierzytelniające klienta”. W tym typie autoryzacji tokeny dostępu OAuth są generowane w zamian za dane logowania klienta, czyli pary klucza i tajnego kodu klienta, jak w przykładzie powyżej.

Typ przyznawanych uprawnień klienta w Edge jest implementowany za pomocą zasad w proxy interfejsu API. Typowy przepływ OAuth obejmuje 2 etapy:

  • Wywołaj proxy interfejsu API 1, aby wygenerować token dostępu OAuth na podstawie danych logowania klienta. Zajmuje się tym zasada OAuth 2.0 w proxy interfejsu API.
  • Wywołaj proxy interfejsu API 2, aby wysłać token dostępu OAuth w wywołaniu interfejsu API. Serwer proxy interfejsu API weryfikuje token dostępu za pomocą zasady OAuth 2.0.

Czego potrzebujesz

  • Konto Apigee Edge. Jeśli jeszcze go nie masz, możesz się zarejestrować, postępując zgodnie z instrukcjami w artykule Tworzenie konta Apigee Edge.
  • cURL zainstalowany na komputerze, aby wykonywać wywołania interfejsu API z wiersza poleceń.

Pobieranie i wdrażanie proxy interfejsu API generującego tokeny

W tym kroku utworzysz proxy interfejsu API, które generuje token dostępu OAuth na podstawie klucza klienta i tajnego klucza klienta wysłanych w wywołaniu interfejsu API. Apigee udostępnia przykładowy serwer proxy interfejsu API, który to robi. Pobierzesz i wdrożysz serwer proxy, a potem użyjesz go w dalszej części samouczka. (Możesz łatwo samodzielnie utworzyć ten proxy interfejsu API. Ten krok pobierania i wdrażania jest wygodny i ma na celu pokazanie, jak łatwo można udostępniać utworzone już proxy).

  1. Pobierz przykładowy plik ZIP z proxy interfejsu API „oauth” do dowolnego katalogu w systemie plików.
  2. Otwórz stronę https://apigee.com/edge i zaloguj się.
  3. Na pasku nawigacyjnym po lewej stronie wybierz Develop > API Proxies (Programowanie > Proxy interfejsu API).
  4. Kliknij + Serwer proxy.
    Przycisk Utwórz proxy
  5. W kreatorze Utwórz serwer proxy kliknij Prześlij pakiet serwera proxy.
  6. Wybierz pobrany plik oauth.zip i kliknij Dalej.
  7. Kliknij Utwórz.
  8. Po zakończeniu kompilacji kliknij Edytuj serwer proxy, aby wyświetlić nowy serwer proxy w edytorze serwera proxy interfejsu API.
  9. Na stronie Przegląd edytora serwera proxy interfejsu API kliknij menu Wdrożenie i wybierz test. Jest to środowisko testowe w Twojej organizacji.

    W oknie potwierdzenia kliknij Wdróż.
    Gdy ponownie klikniesz menu Wdrożenie, zielona ikona wskaże, że serwer proxy został wdrożony w środowisku testowym.

Doskonale! Udało Ci się pobrać i wdrożyć w organizacji Edge proxy interfejsu API generujący token dostępu.

Wyświetlanie procesu OAuth i zasad

Przyjrzyjmy się bliżej temu, co zawiera serwer proxy interfejsu API.

  1. W edytorze proxy interfejsu API kliknij kartę Develop (Tworzenie). W panelu Navigator po lewej stronie zobaczysz 2 zasady. W sekcji Proxy Endpoints zobaczysz też 2 przepływy POST.
  2. Kliknij AccessTokenClientCredential w sekcji Proxy Endpoints.

    W widoku kodu XML zobaczysz element Flow o nazwie AccessTokenClientCredential:

    <Flow name="AccessTokenClientCredential">
        <Description/>
        <Request>
            <Step>
                <Name>GenerateAccessTokenClient</Name>
            </Step>
        </Request>
        <Response/>
        <Condition>(proxy.pathsuffix MatchesPath "/accesstoken") and (request.verb = "POST")</Condition>
    </Flow>

    Przepływ to krok przetwarzania w proxy interfejsu API. W tym przypadku przepływ jest uruchamiany, gdy zostanie spełniony określony warunek (jest to tzw. przepływ warunkowy). Warunek zdefiniowany w elemencie <Condition> mówi, że jeśli wywołanie proxy interfejsu API jest kierowane do zasobu /accesstoken, a czasownik żądania to POST, należy wykonać zasadę GenerateAccessTokenClient, która generuje token dostępu.

  3. Przyjrzyjmy się teraz zasadom, które zostaną uruchomione przez przepływ warunkowy. W diagramie przepływu kliknij ikonę zasady GenerateAccessTokenClient.

    W widoku kodu załadowana jest ta konfiguracja XML:

    <OAuthV2 name="GenerateAccessTokenClient">
        <!-- This policy generates an OAuth 2.0 access token using the client_credentials grant type -->
        <Operation>GenerateAccessToken</Operation>
        <!-- This is in millseconds, so expire in an hour -->
        <ExpiresIn>3600000</ExpiresIn>
        <SupportedGrantTypes>
            <!-- This part is very important: most real OAuth 2.0 apps will want to use other
             grant types. In this case it is important to NOT include the "client_credentials"
             type because it allows a client to get access to a token with no user authentication -->
            <GrantType>client_credentials</GrantType>
        </SupportedGrantTypes>
        <GrantType>request.queryparam.grant_type</GrantType>
        <GenerateResponse/>
    </OAuthV2>

    Konfiguracja obejmuje:

    • <Operation>, która może przyjmować jedną z kilku predefiniowanych wartości, określa, co ma robić zasada. W tym przypadku ma ona generować token dostępu.
    • Token wygaśnie po 1 godzinie (3600000 milisekund) od wygenerowania.
    • <SupportedGrantTypes> oczekiwany protokół OAuth<GrantType> to client_credentials (wymiana klucza klienta i klucza tajnego na token OAuth).
    • Drugi element <GrantType> informuje zasadę, gdzie w wywołaniu interfejsu API szukać parametru typu przyznania, zgodnie ze specyfikacją OAuth 2.0. (Zobaczysz to później w wywołaniu interfejsu API). Typ przyznania może być też wysyłany w nagłówku HTTP (request.header.grant_type) lub jako parametr formularza (request.formparam.grant_type).

W tej chwili nie musisz nic więcej robić z proxy interfejsu API. W dalszych krokach użyjesz tego serwera proxy interfejsu API do wygenerowania tokena dostępu OAuth. Najpierw jednak musisz wykonać jeszcze kilka czynności:

  • Utwórz proxy interfejsu API, które chcesz zabezpieczyć za pomocą OAuth.
  • Utwórz jeszcze kilka artefaktów, które spowodują wygenerowanie klucza klienta i klucza tajnego klienta, które musisz wymienić na token dostępu.

Tworzenie serwera proxy interfejsu API chronionego przez OAuth

Informacje o parametrze „mocktarget”

Usługa mocktarget jest hostowana w Apigee i zwraca proste dane. Dostęp do niego jest możliwy nawet w przeglądarce. Wypróbuj go, klikając ten przycisk:

http://mocktarget.apigee.net/ip

Cel zwraca to, co powinno się wyświetlić po wywołaniu tego serwera proxy interfejsu API.

Możesz też kliknąć http://mocktarget.apigee.net/help, aby zobaczyć inne zasoby interfejsu API dostępne w mocktarget.

Teraz utworzysz proxy interfejsu API, które chcesz chronić. Jest to wywołanie interfejsu API, które zwraca coś, czego potrzebujesz. W tym przypadku proxy interfejsu API wywoła usługę mocktarget Apigee, aby zwrócić Twój adres IP. ALE zobaczysz go tylko wtedy, gdy w wywołaniu interfejsu API przekażesz prawidłowy token dostępu OAuth.

Utworzony tutaj proxy interfejsu API będzie zawierać zasadę, która sprawdza, czy żądanie zawiera token OAuth.

  1. Na pasku nawigacyjnym po lewej stronie wybierz Develop > API Proxies (Programowanie > Proxy interfejsu API).
  2. Kliknij + Serwer proxy.
    Przycisk Utwórz proxy
  3. W kreatorze Build a Proxy (Tworzenie serwera proxy) wybierz Reverse proxy (most common) (Serwer proxy zwrotny (najczęstszy)) i kliknij Next (Dalej).
  4. Skonfiguruj serwer proxy w ten sposób:
    W tym polu wykonaj to
    Nazwa proxy Wpisz: helloworld_oauth2
    Ścieżka podstawowa projektu

    Zmień na: /hellooauth2

    Podstawowa ścieżka projektu jest częścią adresu URL używanego do wysyłania żądań do proxy interfejsu API.

    Istniejący interfejs API

    Wpisz: https://mocktarget.apigee.net/ip

    Określa docelowy adres URL, który Apigee Edge wywołuje w żądaniu do serwera proxy interfejsu API.

    Opis Wpisz: hello world protected by OAuth
  5. Kliknij Dalej.
  6. Na stronie Common policies (Typowe zasady):
    W tym polu wykonaj to
    Bezpieczeństwo: autoryzacja Wybierz OAuth 2.0.
  7. Kliknij Dalej.
  8. Na stronie Wirtualni hostowie kliknij Dalej.
  9. Na stronie Kompilacja upewnij się, że wybrane jest środowisko test, i kliknij Utwórz i wdroż.
  10. Na stronie Podsumowanie zobaczysz potwierdzenie, że nowy serwer proxy interfejsu API został utworzony i wdrożony w środowisku testowym.
  11. Kliknij Edytuj serwer proxy, aby wyświetlić stronę Przegląd serwera proxy interfejsu API.
    Zwróć uwagę, że tym razem proxy interfejsu API jest wdrażany automatycznie. Kliknij menu Deployment (Wdrożenie), aby sprawdzić, czy obok środowiska „test” znajduje się zielona kropka wdrożenia.

Wyświetlanie zasad

Przyjrzyjmy się bliżej temu, co udało Ci się stworzyć.

  1. W edytorze proxy interfejsu API kliknij kartę Develop (Tworzenie). Zobaczysz, że do przepływu żądań serwera proxy interfejsu API dodano 2 zasady:
    • Weryfikacja tokena dostępu OAuth 2.0 – sprawdza wywołanie interfejsu API, aby upewnić się, że jest w nim prawidłowy token OAuth.
    • Remove Header Authorization (Usuń autoryzację nagłówka) – zasada AssignMessage, która usuwa token dostępu po jego sprawdzeniu, aby nie był przekazywany do usługi docelowej. (Jeśli usługa docelowa wymaga tokena dostępu OAuth, nie używasz tej zasady).
  2. W widoku przepływu kliknij ikonę Verify OAuth v2.0 Access Token (Zweryfikuj token dostępu OAuth 2.0) i w panelu kodu sprawdź kod XML poniżej.

    <OAuthV2 async="false" continueOnError="false" enabled="true" name="verify-oauth-v2-access-token">
        <DisplayName>Verify OAuth v2.0 Access Token</DisplayName>
        <Operation>VerifyAccessToken</Operation>
    </OAuthV2>

    Zwróć uwagę na to, że <Operation> to VerifyAccessToken. Operacja określa, co ma robić zasada. W tym przypadku będzie sprawdzać, czy w żądaniu znajduje się prawidłowy token protokołu OAuth.

Dodawanie usługi API

Aby dodać produkt interfejsu API za pomocą interfejsu Apigee:

  1. Kliknij Opublikuj > Usługi API.
  2. Kliknij + Produkt API.
  3. Wpisz szczegóły produktu dla produktu API.
    Pole Opis
    Nazwa Wewnętrzna nazwa produktu API. Nie używaj w nazwie znaków specjalnych.
    Uwaga: po utworzeniu usługi API nie można zmienić jej nazwy. Na przykład helloworld_oauth2-Product
    Wyświetlana nazwa Wyświetlana nazwa produktu interfejsu API. Wyświetlana nazwa jest używana w interfejsie i możesz ją w każdej chwili edytować. Jeśli nie zostanie określona, użyta zostanie wartość Name. To pole jest wypełniane automatycznie na podstawie wartości w polu Nazwa. Możesz edytować lub usunąć jego zawartość. Wyświetlana nazwa może zawierać znaki specjalne. Na przykład: helloworld_oauth2-Product.
    Opis Opis usługi API.
    Środowisko Środowiska, do których produkt API będzie umożliwiał dostęp. Wybierz środowisko, w którym został wdrożony serwer proxy interfejsu API. Na przykład: test.
    Dostęp Wybierz Publiczne.
    Automatycznie zatwierdzaj prośby o dostęp Włącz automatyczne zatwierdzanie próśb o klucze do tego produktu interfejsu API z dowolnej aplikacji.
    Limit Zignoruj to w tym samouczku.
    Dozwolone zakresy OAuth Zignoruj to w tym samouczku.
  4. W polu Proxy interfejsów API wybierz utworzone proxy interfejsu API.
  5. W polu Ścieżka wpisz „/”. Zignoruj pozostałe pola.
  6. Kliknij Zapisz.

Dodawanie dewelopera i aplikacji do organizacji

Następnie zasymulujesz proces rejestracji dewelopera, który chce korzystać z Twoich interfejsów API. Najlepiej, aby programiści rejestrowali siebie i swoje aplikacje w Twoim portalu dla programistów. W tym kroku dodasz dewelopera i aplikację jako administratora.

Deweloper ma co najmniej 1 aplikację, która wywołuje Twoje interfejsy API, a każda aplikacja otrzymuje niepowtarzalny klucz konsumenta i tajny klucz konsumenta. Ten klucz/klucz tajny na aplikację zapewnia też dostawcy interfejsu API bardziej szczegółową kontrolę nad dostępem do interfejsów API i bardziej szczegółowe raportowanie analityczne ruchu związanego z interfejsami API, ponieważ Edge wie, który programista i która aplikacja należą do którego tokena OAuth.

Tworzenie dewelopera

Utwórzmy dewelopera o imieniu i nazwisku Nigel Tufnel.

  1. W menu kliknij Opublikuj > Deweloperzy.
  2. Kliknij + Deweloper.
  3. W oknie Nowy deweloper wpisz te informacje:
    W tym polu Enter
    Imię Nigel
    Nazwisko Tufnel
    Nazwa użytkownika nigel
    E-mail nigel@example.com
  4. Kliknij Utwórz.

Rejestrowanie aplikacji

Utwórzmy aplikację dla Norberta.

  1. Kliknij Opublikuj > Aplikacje.
  2. Kliknij + App (+ Aplikacja).
  3. W oknie Nowa aplikacja wpisz te informacje:
    W tym polu wykonaj to
    Nazwa i Wyświetlana nazwa Wpisz: nigel_app
    Dla programistów Kliknij Programista i wybierz: Nigel Tufnel (nigel@example.com)
    Adres URL wywołania zwrotnegoNotatki Pozostaw to pole puste
  4. W sekcji Produkty kliknij Dodaj produkt.
  5. Wybierz helloworld_oauth2-Product.
  6. Kliknij Utwórz.

Uzyskaj klucz klienta i klucz tajny klienta.

Teraz otrzymasz klucz klienta i tajny klucz klienta, które zostaną wymienione na token dostępu OAuth.

  1. Sprawdź, czy wyświetla się strona nigel_app. Jeśli nie, na stronie Aplikacje (Opublikuj > Aplikacje) kliknij nigel_app.
  2. Na stronie nigel_app kliknij Pokaż w kolumnach KluczTajny klucz. Zwróć uwagę, że klucz i obiekt tajny są powiązane z utworzonym wcześniej automatycznie produktem „helloworld_oauth2-Product”.

  3. Wybierz i skopiuj klucz dostępu i obiekt tajny. Wklej je w tymczasowym pliku tekstowym. Użyjesz ich w późniejszym kroku, w którym wywołasz serwer proxy interfejsu API, który wymieni te dane logowania na token dostępu OAuth.

Spróbuj wywołać interfejs API, aby uzyskać adres IP (nie udało się!)

Dla zabawy spróbuj wywołać chroniony proxy interfejsu API, który powinien zwrócić Twój adres IP. Wykonaj w oknie terminala to polecenie cURL, zastępując nazwę organizacji Edge. Słowo test w adresie URL to środowisko testowe Twojej organizacji, w którym wdrożono serwery proxy. Podstawowa ścieżka serwera proxy to /hellooauth2, czyli ta sama ścieżka podstawowa, którą podano podczas tworzenia serwera proxy. Zwróć uwagę, że w wywołaniu nie przekazujesz tokena dostępu OAuth.

curl https://ORG_NAME-test.apigee.net/hellooauth2

Ponieważ w proxy interfejsu API obowiązuje zasada Verify OAuth v2.0 Access Token, która sprawdza, czy w żądaniu znajduje się prawidłowy token OAuth, wywołanie powinno się nie powieść i wyświetlić ten komunikat:

{"fault":{"faultstring":"Invalid access token","detail":{"errorcode":"oauth.v2.InvalidAccessToken"}}}

W tym przypadku porażka jest dobra. Oznacza to, że Twój proxy interfejsu API jest znacznie bezpieczniejszy. Tylko zaufane aplikacje z prawidłowym tokenem dostępu OAuth mogą wywoływać ten interfejs API.

Uzyskiwanie tokena dostępu OAuth

Teraz przejdziemy do najważniejszej części. Za chwilę użyjesz klucza i klucza tajnego, które zostały skopiowane i wklejone do pliku tekstowego, aby wymienić je na token dostępu OAuth. Teraz wywołasz interfejs API przykładowego serwera proxy API, który został zaimportowany, czyli oauth. Wygeneruje on token dostępu API.

Używając tego klucza i tajnego kodu, wykonaj to wywołanie cURL (pamiętaj, że protokół to https), zastępując nazwę organizacji Edge, klucz i tajny kod w odpowiednich miejscach:

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" \
"https://ORG_NAME-test.apigee.net/oauth/client_credential/accesstoken?grant_type=client_credentials" \
-d "client_id=CLIENT_KEY&client_secret=CLIENT_SECRET"

Jeśli do wykonania połączenia używasz klienta takiego jak Postman, znaki client_idclient_secret muszą znajdować się w treści żądania i muszą być znakiem x-www-form-urlencoded.

Powinna pojawić się taka odpowiedź:

{
  "issued_at" : "1466025769306",
  "application_name" : "716bbe61-f14a-4d85-9b56-a62ff8e0d347",
  "scope" : "",
  "status" : "approved",
  "api_product_list" : "[helloworld_oauth2-Product]",
  "expires_in" : "3599", //--in seconds
  "developer.email" : "nigel@example.com",
  "token_type" : "BearerToken",
  "client_id" : "xNnREu1DNGfiwzQZ5HUN8IAUwZSW1GZW",
  "access_token" : "GTPY9VUHCqKVMRB0cHxnmAp0RXc0",
  "organization_name" : "myOrg",
  "refresh_token_expires_in" : "0", //--in seconds
  "refresh_count" : "0"
}

Token dostępu OAuth został uzyskany. Skopiuj wartość access_token (bez cudzysłowów) i wklej ją do pliku tekstowego. Za chwilę z niej skorzystasz.

Co się właśnie stało?

Pamiętasz, jak wcześniej przyglądaliśmy się przepływowi warunkowemu w proxy OAuth? Ten, który mówił, że jeśli identyfikator URI zasobu to /accesstoken, a czasownik żądania to POST, należy wykonać zasadę OAuth GenerateAccessTokenClient, która generuje token dostępu. Polecenie cURL spełniało te warunki, więc zastosowano zasady OAuth. Sprawdziliśmy Twój klucz konsumenta i klucz tajny konsumenta oraz wymieniliśmy je na token OAuth, który wygaśnie za godzinę.

Wywołanie interfejsu API za pomocą tokena dostępu (sukces!)

Gdy masz już token dostępu, możesz go użyć do wywołania serwera proxy interfejsu API. Wykonaj to wywołanie cURL: Zastąp nazwę organizacji Edge i token dostępu.

curl https://ORG_NAME-test.apigee.net/hellooauth2 -H "Authorization: Bearer TOKEN"

Powinno się teraz wyświetlić wywołanie serwera proxy interfejsu API, które zwraca Twój adres IP. Na przykład:

{"ip":"::ffff:192.168.14.136"}

Możesz powtarzać to wywołanie interfejsu API przez prawie godzinę, po czym token dostępu wygaśnie. Aby wykonać połączenie po upływie godziny, musisz wygenerować nowy token dostępu, wykonując opisane wcześniej czynności.

Gratulacje! Utworzyliśmy proxy interfejsu API i zabezpieczyliśmy go, wymagając, aby wywołanie zawierało prawidłowy token dostępu OAuth.

Powiązane artykuły