Bảo mật API bằng OAuth

Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến Tài liệu về Apigee X.
thông tin

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

  • Tải xuống và triển khai proxy API mẫu.
  • Tạo proxy API được bảo vệ bằng OAuth.
  • Tạo một 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 chỉ cho bạn cách bảo mật API bằng OAuth 2.0.

OAuth là giao thức uỷ quyền cho phép các ứng dụng truy cập thông tin thay mặt cho của 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 cho một mã truy cập. Ví dụ:

joe:joes_password (username:password) hoặc
Nf2moHOASMJeUmXVdDhlMbPaXm2U7eMc:unUOXYpPe74ZfLEb (khoá:bí mật)

sẽ có dạng như sau:

b0uiYwjRZLEo4lEu7ky2GGxHkanN

Mã truy cập là một chuỗi ký tự ngẫu nhiên và mang tính tạm thời (mã 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ã này để xác thực người dùng trong quy trình làm việc của ứng dụng an toàn hơn nhiều so với việc truyền thông tin xác thực thực tế.

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

Loại cấp thông tin đăng nhập ứng dụng trong Edge được triển khai bằng các chính sách trong proxy API. Đáp quy trình OAuth thông thường bao gồm hai bước:

  • Gọi API proxy 1 để tạo mã truy cập OAuth từ ứng dụng thông tin xác thực. 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 lệnh gọi API. Chiến lược phát hành đĩa đơn Proxy API 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 về việc Tạo một Apigee Tài khoản 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 API tạo mã thông báo proxy

Ở bước này, bạn sẽ tạo proxy API giúp tạo mã truy cập OAuth từ một khoá người dùng và thông tin mật của người dùng được gửi trong lệnh gọi API. Apigee cung cấp một proxy API mẫu làm việc này. Bạn sẽ tải xuống và triển khai proxy ngay bây giờ, sau đó sử dụng proxy vào lúc khác trong hướng dẫn. (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 nhằm thuận tiện cho bạn và cho bạn biết việc chia sẻ các proxy đã được tạo dễ dàng như thế nào.)

  1. Tải "oauth" xuống proxy API mẫu ZIP vào bất kỳ thư mục nào trên tệp của bạn hệ thống.
  2. Truy cập vào https://apigee.com/edge rồi đăng nhập.
  3. Chọn Phát triển > Proxy API 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 bản dựng 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 của Trình chỉnh sửa proxy API, hãy nhấp vào trình đơn thả xuống Triển khai rồi chọn kiểm thử. Đây là môi trường thử nghiệm trong tổ chức của bạn.

    Khi được 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 Triển khai, biểu tượng màu xanh lục cho biết proxy là đượ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 API tạo mã truy cập proxy cho tổ chức Edge của bạn.

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

Hãy cùng xem xét kỹ hơn về nội dung proxy API.

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

    Trong khung hiển thị 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 proxy API. Trong trường hợp này, luồng được kích hoạt khi một điều kiện nhất định được đáp ứng (được gọi là luồng 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 đến tài nguyên /accesstoken và động từ yêu cầu là POST, sau đó thực thi chính sách GenerateAccessTokenClient để tạo quyền truy cập mã thông báo.

  3. Bây giờ, hãy xem chính sách mà quy trình 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ơ đồ luồng.

    Cấu hình XML sau đây được tải vào khung hiển thị 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 bao gồm:

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

Hiện tại, bạn không cần phải 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 thực hiện một vài những tính năng khá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 vài cấu phần phần mềm sẽ dẫn đến khóa của người dùng và thông tin mật của người dùng bạn cần đổi lấy mã truy cập.

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

Giới thiệu về thuộc tính "mocktarget"

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

http://mocktarget.apigee.net/ip

Mục tiêu sẽ trả về những gì bạn sẽ thấy khi bạn 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ó sẵn trong mục tiêu mô phỏng.

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ông tin bạn muốn. Trong trường hợp này, proxy API sẽ gọi dịch vụ mocktarget của Apigee để trả lại địa chỉ IP của bạn. NHƯNG, bạn sẽ chỉ thấy phần mở rộng này nếu vượt qua quy trình truy cập OAuth hợp lệ mã thông báo với lệnh gọi API.

Proxy API mà bạn tạo ở đây sẽ chứa một chính sách kiểm tra mã thông báo OAuth trong của bạn.

  1. Chọn Phát triển > Proxy API 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 Tạo proxy, hãy chọn Đảo ngược proxy (phổ biến nhất), rồi nhấp vào Tiếp theo.
  4. Định cấu hình proxy bằng các thành phần sau:
    Trong trường này làm việc này
    Tên proxy Nhập: helloworld_oauth2
    Đường dẫn cơ sở dự án

    Đổi thành: /hellooauth2

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

    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 trong yêu cầu gửi đến 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 Các 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 Virtual Hosts (Máy chủ lưu trữ ảo), hãy nhấp vào Next (Tiếp theo).
  9. Trên trang Build (Tạo), hãy nhớ chọn môi trường kiểm thử rồi nhấp vào Tạo và triển khai.
  10. Trên trang Tóm tắt, bạn sẽ thấy xác nhận rằng proxy API mới của mình đã được tạo thành công và proxy API đã được triển khai cho thử nghiệm của bạn môi trường.
  11. Nhấp vào Chỉnh sửa proxy để hiển thị trang Tổng quan cho proxy API.
    Xin lưu ý rằng lần này proxy API sẽ tự động được triển khai. Nhấp vào Triển khai trình đơn thả xuống để đảm bảo có một chấm triển khai màu xanh lục bên cạnh "kiểm thử" môi trường.

Xem chính sách

Hãy cùng xem kỹ hơn những nội dung 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 hai chính sách đã được thêm vào luồng 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 để thực hiện hãy đảm bảo có mã thông báo OAuth hợp lệ.
    • Xóa ủy quyền tiêu đề – Chính sách AllowMessage sẽ xoá mã truy cập sau khi đã kiểm tra để mã này không bị chuyển vào dịch vụ mục tiêu. (Nếu dịch vụ đích cần mã truy cập OAuth, thì bạn sẽ không dùng chính sách này).
  2. Nhấp vào biểu tượng Verify OAuth v2.0 Access Token (Xác minh mã truy cập OAuth v2.0) trong chế độ xem luồng và hãy xem tệp 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 ý <Operation>VerifyAccessToken. Chiến lược phát hành đĩa đơn Thao tác xác định tác vụ của chính sách. Trong trường hợp này, nó sẽ kiểm tra để có mã thông báo OAuth hợp lệ trong yêu cầu.

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 Product details (Chi tiết sản phẩm) cho sản phẩm API.
    Trường Mô tả
    Tên Tên nội bộ của sản phẩm API. Đừ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 bất cứ lúc nào. Nếu không được chỉ định, giá trị Tên sẽ được sử dụng. Trường này được tự động điền sử dụng giá trị Tên; bạn có thể chỉnh sửa hoặc xoá nội dung. Tên hiển thị có thể chứa 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 Những 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 muốn chuyển sang 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 truy cập Bật tính năng tự động phê duyệt các yêu cầu quan trọng cho sản phẩm API này từ mọi ứng dụng.
    Hạn mức Bỏ qua đối với hướng dẫn này.
    Phạm vi OAuth được phép Bỏ qua đối với hướng dẫn này.
  4. Trong trường Proxy API, hãy chọn proxy API mà bạn vừa tạo.
  5. Trong trường Path (Đường dẫn), 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

Tiếp theo, bạn sẽ mô phỏng quy trình làm việc của một nhà phát triển đăng ký sử dụng các API của bạn. Tốt nhất là nhà phát triển nên tự đăng ký và đăng ký ứng dụng của họ thông qua cổng thông tin dành cho nhà phát triển. Trong phần này bước, bạn sẽ thêm nhà phát triển và ứng dụng làm 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, đồng thời mỗi ứng dụng sẽ nhận được một mã riêng biệt khoá người dùng và thông tin mật của người dùng. Khoá/bí mật cho mỗi ứng dụng này cũng cung cấp cho bạn (nhà cung cấp API) kiểm soát chi tiết hơn đối với 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ề API vì Edge biết nhà phát triển và ứng dụng nào thuộc về 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 có tên là Nigel Tufnel.

  1. Chọn Xuất bản > Developers trong trình đơn.
  2. Nhấp vào + Nhà phát triển.
  3. Nhập nội dung sau vào cửa sổ Nhà phát triển mới:
    Trong trường này (phím) 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 + Ứng dụng.
  3. Nhập nội dung sau vào cửa sổ New App (Ứng dụng mới):
    Trong trường này làm việc này
    Name (Tên) và Display Name (Tê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 phần 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.

Tải khoá người tiêu dùng và thông tin mật của người dùng

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

  1. Đảm bảo trang nigel_app được hiển thị. 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 thị) trong khoá Key (Khoá) và Bí mật. Lưu ý rằng khoá/bí mật đang liên kết với "helloworld_oauth2-Product" được tạo tự động trước đó.

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

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

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

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

Do proxy API có chính sách Xác minh mã truy cập OAuth phiên bản 2.0 đang kiểm tra xem có mã thông báo OAuth hợp lệ trong yêu cầu hay không, lệnh gọi sẽ không thực hiện được với: thông báo:

{"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 đó có nghĩa là proxy API của bạn an toàn hơn nhiều. Chỉ những người đáng tin cậy ứng dụng có mã truy cập OAuth hợp lệ có thể gọi thành công API này.

Nhận mã truy cập OAuth

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

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

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"

Lưu ý rằng nếu bạn đang sử dụng một khách hàng như Postman để thực hiện cuộc gọi, client_idclient_secret đi vào phần 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 đã nhận được mã truy cập OAuth! Sao chép giá trị access_token (không có dấu ngoặc kép) và dán vào tệp văn bản. Bạn sẽ dùng hàm này sau giây lát.

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

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

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

Giờ đây, khi đã có mã truy cập, bạn có thể sử dụng mã này để gọi proxy API. Làm cho sau lệnh gọi cURL. Thay thế tên tổ chức trong Edge và mã truy cập.

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

Bây giờ, bạn sẽ nhận được 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 khoảng một giờ, sau thời gian đó, 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ách sử dụ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 này bằng cách yêu cầu một proxy API hợp lệ Mã truy cập OAuth sẽ được đưa vào cuộc gọi.

Chủ đề có liên quan