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 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 thay mặt người dùng truy cập vào thông tin 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á/mật khẩu) được đổi lấy một mã truy cập. Ví dụ:

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

sẽ trở thành dạng như sau:

b0uiYwjRZLEo4lEu7ky2GGxHkanN

Mã truy cập là một chuỗi ký tự ngẫu nhiên và chỉ là 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 công 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ế.

Thông số kỹ thuật của OAuth 2.0 xác định các cơ chế khác nhau, được gọi là "loại cấp quyền" để phân phối mã truy cập cho các ứng dụng. Hình thức cấp cơ bản nhất do OAuth 2.0 xác định được gọi là "thông tin xác thực ứng dụng". Trong loại tài trợ này, mã thông báo truy cập OAuth được tạo để đổi lấy thông tin đăng nhập ứng dụng. Đây là các cặp khoá người dùng/thông tin 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. Một quy trình OAuth thông thường bao gồm 2 bước:

  • Gọi proxy API 1 để tạo mã truy cập OAuth từ thông tin xác thực của ứng dụng. Chính sách OAuth phiên bản 2.0 trên proxy API sẽ xử lý vấn đề này.
  • Gọi proxy API 2 để gửi mã truy cập OAuth trong lệnh gọi API. 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 này, bạn có thể đăng ký theo hướng dẫn trong bài viết 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 proxy API tạo mã thông báo

Ở bước này, bạn sẽ tạo proxy API để tạo mã truy cập OAuth 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 để thực hiện 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 sau 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 để 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 proxy API mẫu ' OAuth' xuống tệp ZIP vào bất kỳ thư mục nào trên hệ thống tệp của bạn.
  2. Truy cập 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 Create Proxy (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 Edit proxy (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, nhấp vào trình đơn thả xuống Triển khai và chọn kiểm thử. Đây là môi trường thử nghiệm trong tổ chức của bạn.

    Khi có 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 Triển khai, biểu tượng màu xanh lục cho biết proxy đã được triển khai đến môi trường kiểm thử.

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 của mình trong Edge.

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, nhấp vào thẻ Phát triển. Trong ngăn 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 (flow) 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 đáp ứng một điều kiện nhất định (đượ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, 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à 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ơ đồ 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 mục sau:

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

Hiện tại, bạn không cần phải làm gì 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 vài bước nữa:

  • 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ẽ tạo ra khoá của người dùng và thông tin mật của người dùng mà 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ề "mocktarget"

Dịch vụ mocktarget do Apigee lưu trữ 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 trình duyệt web. Hãy dùng thử bằng cách nhấp vào nút sau:

http://mocktarget.apigee.net/ip

Mục tiêu sẽ trả về nội dung bạn sẽ thấy khi cuối cùng 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ề nội dung bạn muốn. Trong trường hợp này, proxy API sẽ gọi dịch vụ mục tiêu mô phỏng của Apigee để trả về địa chỉ IP của bạn. NHƯNG, bạn sẽ chỉ thấy mã này nếu truyền mã truy cập OAuth hợp lệ thông qua 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 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 Build a Proxy (Tạo proxy), hãy chọn phiếu proxy 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 thao tác sau:
    Trong trường này thực hiện thao tác này
    Tên proxy Nhập: helloworld_oauth2
    Project Base Path (Đường dẫn cơ sở của dự án)

    Đổi thành: /hellooauth2

    Project Base Path là một phần của URL dùng để gửi yêu cầu đến proxy API.

    API hiện tại

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

    Đoạn mã này xác định URL mục tiêu mà Apigee Edge gọi trong một yêu cầu tới proxy API.

    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 phổ biến:
    Trong trường này thực hiện thao tá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ủ ả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 test (kiểm thử) 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 proxy API mới đã được tạo thành công và proxy API đã được triển khai đến môi trường thử nghiệm.
  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ẽ tự động được triển khai. Nhấp vào trình đơn thả xuống Triển khai để đảm bảo có một dấu chấm triển khai màu xanh lục bên cạnh môi trường "kiểm thử".

Xem chính sách

Hãy cùng xem xét kỹ hơn những nội dung bạn đã tạo.

  1. Trong trình chỉnh sửa proxy API, nhấp vào thẻ Phát triển. Bạn sẽ thấy 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 AssignmentsMessage sẽ xoá mã truy cập sau khi kiểm tra để không chuyển mã này tới 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 phiên bản 2.0) trong chế độ xem quy trình rồi xem mã 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. Thao tác sẽ xác định hành động mà chính sách sẽ thực hiện. Trong trường hợp này, thao tác này sẽ kiểm tra mã thông báo OAuth hợp lệ trong yêu cầu.

Thêm sản phẩm API

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

  1. Chọn Publish > API Products (Xuất bản > Sản phẩm API).
  2. Nhấp vào +Sản phẩm API.
  3. Nhập Chi tiết 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. Đừ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ị cho sản phẩm API. Tên hiển thị được sử dụng trong giao diện người dùng và bạn có thể chỉnh sửa tên đó 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 bằng giá trị Tên; bạn có thể chỉnh sửa hoặc xoá nội dung của trường. Tên hiển thị có thể chứa các ký tự đặc biệt. Ví dụ: helloworld_oauth2-Product.
    Nội dung 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 các yêu cầu cấp quyền truy cập Bật tính năng tự động phê duyệt các yêu cầu chính 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 Uỷ quyền API, hãy chọn proxy API 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 làm việc của quá trình đăng ký sử dụng 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. Tuy nhiên, trong bước này, 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 và mỗi ứng dụng sẽ nhận một khoá người dùng và thông tin bí mật của người tiêu dùng. Khoá/thông tin bí mật cho mỗi ứng dụng này cũng cấp cho bạn, nhà cung cấp API, quyền 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 số liệu phân tích chi tiết hơn về lưu lượng truy cập API, vì Edge biết được 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 có tên là Nigel Tufnel.

  1. Chọn Publish > Developers (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 nội dung sau vào cửa sổ New Developer (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 thực hiện thao tá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 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.

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

Bây giờ, bạn sẽ nhận được khoá của người dùng và thông tin mật của người dùng sẽ được đổ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 Hiển thị trong cột KhoáBí mật. Xin lưu ý rằng khoá/mã bí mật liên kết với tệp "helloworld_ OAuth2-Product" đã được tạo tự động trước đó.

  3. Chọn rồi sao chép Khoá và Bí mật. Dán 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 bước sau, trong đó bạn gọi proxy API sẽ trao đổi thông tin xác thực này lấy mã truy cập OAuth.

Thử gọi API để nhận địa chỉ IP của bạn (không thành công!)

Đối với các lượt truy cập, hãy thử gọi proxy API được bảo vệ mà đáng lẽ sẽ trả về địa chỉ IP của bạn. Thực thi lệnh cURL sau đây trong một cửa sổ dòng lệnh, thay thế tên tổ chức trong Edge. Từ test trong URL là môi trường thử nghiệm của tổ chức, môi trường mà bạn đã triển khai proxy của mình. Đường dẫn cơ sở proxy là /hellooauth2, chính là đường dẫn cơ sở mà bạn đã chỉ định khi tạo proxy. 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ó quy trình kiểm tra chính sách Verify OAuth v2.0 Access Token (Xác minh mã truy cập OAuth phiên bản 2.0) để tìm 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 đó có nghĩa là proxy API của bạn 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.

Nhận mã truy cập OAuth

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

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

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 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 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 của bạn. Bạn sẽ dùng được sau giây lát.

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

Bạn còn nhớ trước đây, khi bạn xem xét luồng có điều kiện trong proxy oauth, tuỳ chọn cho biết nếu URI tài nguyên là /accesstoken và động từ yêu cầu là POST hay không, để thực thi chính sách OAuth GenerateAccessTokenClient tạo 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. Tài khoản này đã xác minh khoá người dùng và thông tin mật của người dùng rồi đổi chúng lấy một 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ể 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"

Bây giờ, 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 mình. Ví dụ:

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

Bạn có thể lặp lại lệnh gọi API đó trong vòng gần một giờ. Sau khoảng thời gian đó, mã truy cập sẽ hết hạn. Để thực hiện lệnh gọi sau một giờ, bạn cần tạo mã truy cập mới theo 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 đưa mã truy cập OAuth hợp lệ vào lệnh gọi.

Chủ đề có liên quan