Bảo mật API bằng OAuth

Bạn đang xem tài liệu về Apigee Edge.
Truy cập vào tài liệu Apigee X.
thông tin

Kiến thức bạn sẽ học được

  • Tải xuống và triển khai một proxy API mẫu.
  • Tạo một proxy API được bảo vệ bằng OAuth.
  • Tạo sản phẩm, nhà phát triển và ứng dụng.
  • Trao đổi thông tin đăng nhập để lấy mã truy cập OAuth.
  • Gọi một API bằng mã truy cập.

Hướng dẫn này cho bạn biết cách bảo mật một API bằng OAuth 2.0.

OAuth là một giao thức uỷ quyền cho phép các ứng dụng truy cập vào thông tin thay cho người dùng mà không yêu cầu người dùng tiết lộ tên người dùng và mật khẩu của họ.

Với OAuth, thông tin đăng nhập bảo mật (chẳng hạn như tên người dùng/mật khẩu hoặc khoá/bí mật) sẽ được trao đổi để lấy mã truy cập. Ví dụ:

joe:joes_password (username:password) hoặc
Nf2moHOASMJeUmXVdDhlMbPaXm2U7eMc:unUOXYpPe74ZfLEb (key:secret)

trở thành:

b0uiYwjRZLEo4lEu7ky2GGxHkanN

Mã truy cập là một chuỗi ký tự ngẫu nhiên và chỉ có hiệu lực tạm thời (mã này sẽ hết hạn sau một khoảng thời gian tương đối ngắn). Vì vậy, việc truyền mã truy cập để xác thực người dùng trong quy trình làm việc của ứng dụng sẽ an toàn hơn nhiều so với việc truyền thông tin đăng nhập thực tế.

Quy cách OAuth 2.0 xác định nhiều cơ chế (gọi là "các loại cấp quyền") để phân phối mã truy cập cho các ứng dụng. Loại quyền cơ bản nhất do OAuth 2.0 xác định được gọi là "thông tin đăng nhập ứng dụng". Trong loại cấp quyền này, mã truy cập OAuth được tạo để đổi lấy thông tin xác thực của ứng dụng, là các cặp khoá người dùng/khoá bí mật của người dùng, chẳng hạn như ví dụ ở trên.

Loại cấp thông tin xác thực của ứng dụng trong Edge được triển khai bằng cách sử dụng các chính sách trong các proxy API. Một quy trình OAuth điển hình bao gồm 2 bước:

  • Gọi API proxy 1 để tạo mã truy cập OAuth từ thông tin đăng nhập của ứng dụng. Một chính sách OAuth phiên bản 2.0 trên proxy API sẽ xử lý việc này.
  • Gọi API proxy 2 để gửi mã truy cập OAuth trong một lệnh gọi API. API proxy xác minh mã truy cập bằng chính sách OAuth phiên bản 2.0.

Bạn cần có

  • Một tài khoản Apigee Edge. Nếu chưa có tài khoản, bạn có thể đăng ký theo hướng dẫn tại Tạo tài khoản Apigee Edge.
  • cURL được cài đặt trên máy của bạn để thực hiện lệnh gọi API từ dòng lệnh.

Tải xuống và triển khai một proxy API tạo mã thông báo

Trong bước này, bạn sẽ tạo một proxy API tạo mã truy cập OAuth từ khoá của người dùng và thông tin bí mật của người dùng được gửi trong một Lệnh gọi API. Apigee cung cấp một API proxy mẫu thực hiện việc này. Bây giờ, bạn sẽ tải xuống và triển khai proxy, sau đó sử dụng proxy này trong hướng dẫn sau. (Bạn có thể tự tạo proxy API này một cách dễ dàng. Bước tải xuống và triển khai này là để thuận tiện và cho bạn thấy việc chia sẻ các proxy đã được tạo dễ dàng như thế nào.)

  1. Tải tệp ZIP của proxy API mẫu "oauth" xuống bất kỳ thư mục nào trên hệ thống tệp của bạn.
  2. Truy cập vào https://apigee.com/edge rồi đăng nhập.
  3. Chọn Develop > API Proxies (Phát triển > API Proxy) trong thanh điều hướng bên trái.
  4. Nhấp vào + Proxy.
    Nút Tạo proxy
  5. Trong trình hướng dẫn Tạo proxy, hãy nhấp vào Tải gói proxy lên.
  6. Chọn tệp oauth.zip mà bạn đã tải xuống, rồi nhấp vào Tiếp theo.
  7. Nhấp vào Tạo.
  8. Sau khi quá trình tạo hoàn tất, hãy nhấp vào Chỉnh sửa proxy để xem proxy mới trong trình chỉnh sửa proxy API.
  9. Trên trang Tổng quan về trình chỉnh sửa API Proxy, hãy nhấp vào trình đơn thả xuống Triển khai rồi chọn test. Đây là môi trường thử nghiệm trong tổ chức của bạn.

    Tại lời nhắc xác nhận, hãy nhấp vào Triển khai.
    Khi bạn nhấp lại vào trình đơn thả xuống Deployment (Triển khai), một biểu tượng màu xanh lục sẽ cho biết rằng proxy được triển khai vào môi trường thử nghiệm.

Bạn làm tốt lắm! Bạn đã tải xuống và triển khai thành công một proxy API tạo mã truy cập cho tổ chức Edge của mình.

Xem quy trình và chính sách OAuth

Hãy cùng tìm hiểu kỹ hơn về nội dung của proxy API.

  1. Trong trình chỉnh sửa proxy API, hãy nhấp vào thẻ Phát triển. Trong ngăn Navigator (Trình điều hướng) ở bên trái, bạn sẽ thấy 2 chính sách. Bạn cũng sẽ thấy 2 luồng POST trong phần Proxy Endpoints.
  2. Nhấp vào AccessTokenClientCredential trong Proxy Endpoints.

    Trong chế độ xem mã XML, bạn sẽ thấy một Flow có tên là AccessTokenClientCredential:

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

    Luồng là một bước xử lý trong một proxy API. Trong trường hợp này, quy trình sẽ được kích hoạt khi một điều kiện nhất định được đáp ứng (đây được gọi là quy trình có điều kiện). Điều kiện được xác định trong phần tử <Condition> cho biết rằng nếu lệnh gọi proxy API được thực hiện cho tài nguyên /accesstoken và động từ yêu cầu là POST, thì hãy thực thi chính sách GenerateAccessTokenClient để tạo mã truy cập.

  3. Bây giờ, hãy xem chính sách mà luồng có điều kiện sẽ kích hoạt. Nhấp vào biểu tượng chính sách GenerateAccessTokenClient trong sơ đồ quy trình.

    Cấu hình XML sau đây được tải vào chế độ xem mã:

    <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>

    Cấu hình này bao gồm những nội dung sau:

    • <Operation> (có thể là một trong số các giá trị được xác định trước) sẽ xác định những việc mà chính sách sẽ làm. Trong trường hợp này, chính sách sẽ tạo mã truy cập.
    • Mã thông báo sẽ hết hạn sau 1 giờ (3.600.000 mili giây) kể từ khi được tạo.
    • Trong <SupportedGrantTypes>, OAuth <GrantType> dự kiến sẽ được sử dụng là client_credentials (trao đổi khoá của người dùng và bí mật để lấy mã thông báo OAuth).
    • Phần tử <GrantType> thứ hai cho biết chính sách cần tìm tham số loại cấp phép ở đâu trong lệnh gọi API, theo yêu cầu của quy cách OAuth 2.0. (Bạn sẽ thấy thông tin này trong lệnh gọi API sau). Bạn cũng có thể gửi loại cấp quyền trong tiêu đề HTTP (request.header.grant_type) hoặc dưới dạng một tham số biểu mẫu (request.formparam.grant_type).

Hiện tại, bạn không cần làm gì khác với proxy API. Trong các bước sau, bạn sẽ dùng proxy API này để tạo mã truy cập OAuth. Nhưng trước tiên, bạn cần làm thêm một số việc:

  • Tạo proxy API mà bạn thực sự muốn bảo mật bằng OAuth.
  • Tạo thêm một số cấu phần phần mềm sẽ tạo ra khoá của người dùng: và bí mật người dùng mà bạn cần trao đổi để lấy mã truy cập.

Tạo proxy API được bảo vệ bằng OAuth

Giới thiệu về "mocktarget"

Dịch vụ mocktarget được lưu trữ tại Apigee và trả về dữ liệu đơn giản. Trên thực tế, bạn có thể truy cập vào tính năng này trong một trình duyệt web. Hãy thử bằng cách nhấp vào những nội dung sau:

http://mocktarget.apigee.net/ip

Mục tiêu trả về những gì bạn sẽ thấy khi cuối cùng gọi proxy API này.

Bạn cũng có thể truy cập http://mocktarget.apigee.net/help để xem các tài nguyên API khác có trong mocktarget.

Bây giờ, bạn sẽ tạo proxy API mà bạn muốn bảo vệ. Đây là lệnh gọi API trả về thứ bạn muốn. Trong trường hợp này, proxy API sẽ gọi dịch vụ mocktarget của Apigee để trả về địa chỉ IP của bạn. TUY NHIÊN, bạn sẽ chỉ thấy thông tin này nếu truyền mã thông báo truy cập OAuth hợp lệ bằng lệnh gọi API.

Proxy API mà bạn tạo ở đây sẽ bao gồm một chính sách kiểm tra mã thông báo OAuth trong yêu cầu.

  1. Chọn Develop > API Proxies (Phát triển > API Proxy) trong thanh điều hướng bên trái.
  2. Nhấp vào + Proxy.
    Nút Tạo proxy
  3. Trong trình hướng dẫn Build a Proxy (Tạo một proxy), hãy chọn Reverse proxy (most common) (Proxy đảo ngược (phổ biến nhất)), rồi nhấp vào Next (Tiếp theo).
  4. Định cấu hình proxy bằng các thông tin sau:
    Trong trường này làm việc này
    Tên proxy Nhập: helloworld_oauth2
    Đường dẫn cơ sở của dự án

    Thay đổi thành: /hellooauth2

    Đường dẫn cơ sở của dự án là một phần của URL dùng để gửi yêu cầu đến proxy API.

    API hiện có

    Nhập: https://mocktarget.apigee.net/ip

    Thao tác này xác định URL mục tiêu mà Apigee Edge gọi theo yêu cầu đối với API proxy.

    Nội dung mô tả Nhập: hello world protected by OAuth
  5. Nhấp vào Tiếp theo.
  6. Trên trang Chính sách chung:
    Trong trường này làm việc này
    Bảo mật: Uỷ quyền Chọn: OAuth 2.0
  7. Nhấp vào Tiếp theo.
  8. Trên trang Máy chủ ảo, hãy nhấp vào Tiếp theo.
  9. Trên trang Build (Tạo), hãy nhớ chọn môi trường test (thử nghiệm) rồi nhấp vào Create and Deploy (Tạo và triển khai).
  10. Trên trang Tóm tắt, bạn sẽ thấy thông báo xác nhận rằng bạn đã tạo thành công API proxy mới và API proxy đó đã được triển khai vào môi trường kiểm thử.
  11. Nhấp vào Chỉnh sửa proxy để hiển thị trang Tổng quan cho proxy API.
    Lưu ý rằng lần này, proxy API sẽ được triển khai tự động. Nhấp vào trình đơn thả xuống Deployment (Triển khai) để đảm bảo có dấu chấm triển khai màu xanh lục bên cạnh môi trường "test" (kiểm thử).

Xem chính sách

Hãy cùng xem kỹ hơn những gì bạn đã tạo.

  1. Trong trình chỉnh sửa proxy API, hãy nhấp vào thẻ Phát triển. Bạn sẽ thấy rằng 2 chính sách đã được thêm vào quy trình yêu cầu của proxy API:
    • Xác minh mã truy cập OAuth phiên bản 2.0 – Kiểm tra lệnh gọi API để đảm bảo có mã thông báo OAuth hợp lệ.
    • Xoá uỷ quyền tiêu đề – Một chính sách AssignMessage giúp xoá mã truy cập sau khi mã này được kiểm tra, để mã không được truyền đến dịch vụ đích. (Nếu dịch vụ đích cần mã truy cập OAuth, bạn sẽ không sử dụng chính sách này).
  2. Nhấp vào biểu tượng Xác minh mã truy cập OAuth phiên bản 2.0 trong chế độ xem luồng và xem XML bên dưới trong ngăn mã.

    <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>

    Lưu ý rằng <Operation>VerifyAccessToken. Thao tác xác định những việc mà chính sách này phải làm. Trong trường hợp này, chính sách sẽ kiểm tra xem có mã thông báo OAuth hợp lệ trong yêu cầu hay không.

Thêm một sản phẩm API

Cách thêm một sản phẩm API bằng giao diện người dùng Apigee:

  1. Chọn Xuất bản > Sản phẩm API.
  2. Nhấp vào + Sản phẩm API.
  3. Nhập Thông tin chi tiết về sản phẩm cho sản phẩm API của bạn.
    Trường Nội dung mô tả
    Tên Tên nội bộ của sản phẩm API. Không chỉ định ký tự đặc biệt trong tên.
    Lưu ý: Bạn không thể chỉnh sửa tên sau khi tạo sản phẩm API. Ví dụ: helloworld_oauth2-Product
    Tên hiển thị Tên hiển thị của sản phẩm API. Tên hiển thị được dùng trong giao diện người dùng và bạn có thể chỉnh sửa tên này bất cứ lúc nào. Nếu bạn không chỉ định, giá trị Tên sẽ được sử dụng. Trường này được điền sẵn bằng giá trị Tên; bạn có thể chỉnh sửa hoặc xoá nội dung của trường này. Tên hiển thị có thể chứa các ký tự đặc biệt. Ví dụ: helloworld_oauth2-Product.
    Mô tả Nội dung mô tả về sản phẩm API.
    Môi trường Các môi trường mà sản phẩm API sẽ cho phép truy cập. Chọn môi trường mà bạn đã triển khai proxy API. Ví dụ: test.
    Quyền truy cập Chọn Công khai.
    Tự động phê duyệt yêu cầu cấp quyền truy cập Cho phép tự động phê duyệt các yêu cầu khoá cho sản phẩm API này từ mọi ứng dụng.
    Hạn mức Bỏ qua phần này trong hướng dẫn này.
    Phạm vi OAuth được phép Bỏ qua phần này trong hướng dẫn này.
  4. Trong trường API proxies (API proxy), hãy chọn API proxy mà bạn vừa tạo.
  5. Trong trường Đường dẫn, hãy nhập "/". Bỏ qua các trường khác.
  6. Nhấp vào Lưu.

Thêm nhà phát triển và ứng dụng vào tổ chức của bạn

Tiếp theo, bạn sẽ mô phỏng quy trình đăng ký sử dụng API của nhà phát triển. Tốt nhất là nhà phát triển tự đăng ký và đăng ký ứng dụng của họ thông qua cổng thông tin cho nhà phát triển của bạn. Tuy nhiên, trong bước này, bạn sẽ thêm một nhà phát triển và một ứng dụng với tư cách là quản trị viên.

Nhà phát triển sẽ có một hoặc nhiều ứng dụng gọi API của bạn và mỗi ứng dụng sẽ nhận được một khoá của người dùng: và khoá bí mật người dùng riêng biệt. Khoá/bí mật cho mỗi ứng dụng này cũng giúp bạn (nhà cung cấp API) kiểm soát chi tiết hơn quyền truy cập vào API của bạn và báo cáo phân tích chi tiết hơn về lưu lượng truy cập API, vì Edge biết nhà phát triển và ứng dụng nào thuộc mã thông báo OAuth nào.

Tạo nhà phát triển

Hãy tạo một nhà phát triển tên là Nigel Tufnel.

  1. Chọn Xuất bản > Nhà phát triển trong trình đơn.
  2. Nhấp vào + Nhà phát triển.
  3. Nhập thông tin sau vào cửa sổ Nhà phát triển mới:
    Trong trường này Enter
    Tên Nigel
    Họ Tufnel
    Tên người dùng nigel
    Email nigel@example.com
  4. Nhấp vào Tạo.

Đăng ký ứng dụng

Hãy tạo một ứng dụng cho Nigel.

  1. Chọn Xuất bản > Ứng dụng.
  2. Nhấp vào + App (+ Ứng dụng).
  3. Nhập thông tin sau vào cửa sổ New App (Ứng dụng mới):
    Trong trường này làm việc này
    TênTên hiển thị Nhập: nigel_app
    Nhà phát triển Nhấp vào Nhà phát triển rồi chọn: Nigel Tufnel (nigel@example.com)
    URL gọi lạiGhi chú Để trống
  4. Trong mục Sản phẩm, hãy nhấp vào Thêm sản phẩm.
  5. Chọn helloworld_oauth2-Product.
  6. Nhấp vào Tạo.

Lấy khoá của người dùng và khoá bí mật của người dùng

Giờ đây, bạn sẽ nhận được khoá của người dùng và bí mật của người dùng sẽ được trao đổi để lấy mã truy cập OAuth.

  1. Đảm bảo rằng trang nigel_app xuất hiện. Nếu không, trên trang Ứng dụng (Xuất bản > Ứng dụng), hãy nhấp vào nigel_app.
  2. Trên trang nigel_app, hãy nhấp vào Show (Hiện) trong các cột Key (Khoá) và Secret (Bí mật). Xin lưu ý rằng khoá/mã bí mật được liên kết với "helloworld_oauth2-Product" đã được tạo tự động trước đó.

  3. Chọn và sao chép Khoá và Khoá bí mật. Dán các tệp đó vào một tệp văn bản tạm thời. Bạn sẽ sử dụng các thông tin này trong một bước sau, khi gọi proxy API sẽ trao đổi các thông tin này để lấy mã truy cập OAuth.

Thử gọi API để lấy địa chỉ IP của bạn (thất bại!)

Để cho vui, hãy thử gọi proxy API được bảo vệ, proxy này sẽ trả về địa chỉ IP của bạn. Thực thi lệnh cURL sau đây trong cửa sổ dòng lệnh, thay thế tên tổ chức Edge của bạn. Từ test trong URL là môi trường thử nghiệm của tổ chức bạn, tức là môi trường mà bạn đã triển khai các proxy. Đường dẫn cơ sở của proxy là /hellooauth2, cũng là đường dẫn cơ sở mà bạn đã chỉ định khi tạo proxy. Xin lưu ý rằng bạn không truyền mã truy cập OAuth trong lệnh gọi.

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

Vì proxy API có chính sách Xác minh mã truy cập OAuth phiên bản 2.0 kiểm tra mã thông báo OAuth hợp lệ trong yêu cầu, nên lệnh gọi sẽ không thành công với thông báo sau:

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

Trong trường hợp này, thất bại là điều tốt! Điều này có nghĩa là proxy API của bạn sẽ an toàn hơn nhiều. Chỉ những ứng dụng đáng tin cậy có mã truy cập OAuth hợp lệ mới có thể gọi API này thành công.

Lấy mã truy cập OAuth

Giờ chúng ta sẽ nhận được phần thưởng lớn. Bạn sắp sử dụng khoá và bí mật mà bạn đã sao chép và dán vào một tệp văn bản, rồi trao đổi chúng để lấy mã truy cập OAuth. Bây giờ, bạn sẽ thực hiện một lệnh gọi API đến proxy mẫu API mà bạn đã nhập, oauth. Lệnh gọi này sẽ tạo mã truy cập API.

Sử dụng khoá và bí mật đó, hãy thực hiện lệnh gọi cURL sau đây (lưu ý rằng giao thức là https), thay thế tên tổ chức Edge, khoá và bí mật của bạn ở nơi được chỉ định:

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"

Xin lưu ý rằng nếu bạn đang sử dụng một ứng dụng như Postman để thực hiện lệnh gọi, thì client_idclient_secret sẽ nằm trong Nội dung của yêu cầu và phải là x-www-form-urlencoded.

Bạn sẽ nhận được phản hồi như sau:

{
  "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"
}

Bạn đã lấy được mã truy cập OAuth! Sao chép giá trị access_token (không có dấu ngoặc kép) rồi dán vào tệp văn bản. Bạn sẽ dùng nó trong giây lát.

Điều gì vừa xảy ra?

Bạn có nhớ trước đây khi bạn xem luồng có điều kiện đó trong proxy oauth không? Luồng đó cho biết nếu URI tài nguyên là /accesstoken và động từ yêu cầu là POST, thì sẽ thực thi chính sách OAuth GenerateAccessTokenClient tạo ra một mã truy cập? Lệnh cURL của bạn đáp ứng các điều kiện đó, vì vậy chính sách OAuth đã được thực thi. Nó đã xác minh khoá của người dùng và thông tin bí mật của người dùng, đồng thời trao đổi chúng để lấy mã thông báo OAuth hết hạn sau 1 giờ.

Gọi API bằng mã truy cập (thành công!)

Giờ đây, bạn đã có mã truy cập, bạn có thể dùng mã này để gọi proxy API. Thực hiện lệnh gọi cURL sau. Thay thế tên tổ chức Edge và mã truy cập.

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

Giờ đây, bạn sẽ nhận được một lệnh gọi thành công đến proxy API trả về địa chỉ IP của bạn. Ví dụ:

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

Bạn có thể lặp lại lệnh gọi API đó trong gần một giờ, sau khoảng thời gian này, mã truy cập sẽ hết hạn. Để thực hiện cuộc gọi sau một giờ, bạn cần tạo mã truy cập mới bằng các bước trước đó.

Xin chúc mừng! Bạn đã tạo một proxy API và bảo vệ proxy đó bằng cách yêu cầu phải có mã truy cập OAuth hợp lệ trong lệnh gọi.

Chủ đề có liên quan