GTAF sử dụng khoá người dùng để xác định người đăng ký khi giao tiếp với DPA. Những ứng dụng có quyền truy cập vào MSISDN của người dùng có thể sử dụng MSISDN này làm user_key. Mặt khác, những ứng dụng không có quyền truy cập vào MSISDN cần thiết lập một mã nhận dạng gói dịch vụ của nhà mạng (CPID) mà không cần khám phá MSISDN của người dùng. Trong phần tiếp theo, chúng ta sẽ mô tả cơ chế thiết lập CPID.
Luồng cuộc gọi CPID
Hình 2: Luồng cuộc gọi để thiết lập CPID.
- Một ứng dụng của Google ở Liên minh Châu Âu sử dụng một API nội bộ của Google để truy xuất URL của điểm cuối CPID từ GTAF. Nhà mạng được xác định bằng địa chỉ IP công khai của máy khách và MCC+MNC của thẻ SIM đang hoạt động. Trong trường hợp MVNO, Google sẽ sử dụng SPN và GID1 để xác định MVNO
- Ứng dụng khách gửi một yêu cầu HTTP GET đến điểm cuối CPID. Nhà mạng CÓ THỂ hỗ trợ gửi yêu cầu qua HTTPS.
- Nhà mạng CÓ THỂ sử dụng chức năng Kiểm tra gói dữ liệu chuyên sâu để xác định yêu cầu và chèn số điện thoại của người dùng vào yêu cầu dưới dạng tiêu đề HTTP.
- Điểm cuối CPID nhận yêu cầu, tạo CPID và trả về CPID cho UE với thời gian tồn tại (TTL) cho biết thời gian UE có thể sử dụng CPID này.
Nhà khai thác CŨNG CÓ THỂ sử dụng địa chỉ IP thay vì tên miền trong URL điểm cuối CPID nếu muốn. Địa chỉ IP CÓ THỂ nằm trong không gian địa chỉ riêng tư nhưng phải có thể truy cập được bởi các máy khách của Google trong mạng của nhà khai thác.
Nhà điều hành PHẢI cung cấp cho Google những thông tin sau trong quá trình tham gia:
- CPID_URL mà các ứng dụng sẽ liên hệ để lấy CPID. Bạn bắt buộc phải có một CPID_URL nhưng nhà khai thác có thể cung cấp nhiều URL để tăng khả năng cung cấp.
- Danh sách tiền tố IP mà nhà mạng sở hữu, Mã di động quốc gia (MCC) và(các) Mã mạng di động (MNC) mà nhà mạng muốn được liên kết với CPID_URL đã cung cấp. Nếu nhà mạng sử dụng SPN hoặc GID1 để phân biệt MVNO trong mạng của họ, thì nhà mạng CẦN cung cấp thông tin này. Google sẽ sử dụng thông tin này để so khớp các ứng dụng với các điểm cuối CPID tương ứng, như minh hoạ trong Bước 1 của Hình 2.
Định dạng của yêu cầu là:
GET CPID_URL
Vì lý do cũ, điểm cuối CPID phải có thể hỗ trợ một yêu cầu như sau:
GET CPID_URL?app={app_id}
Điểm cuối CPID có thể bỏ qua tham số URL {app_id}
khi tạo CPID. Tuy nhiên, nó PHẢI có khả năng xử lý yêu cầu chứa tham số này.
Yêu cầu đến điểm cuối CPID CÓ THỂ bao gồm tiêu đề Accept-Language
. Nếu tiêu đề được đưa vào, thì các chuỗi mà con người có thể đọc được trong nội dung cập nhật mà DPA gửi bằng Mobile Data Plan Sharing API PHẢI sử dụng các chế độ cài đặt được cung cấp trong yêu cầu CPID.
Mỗi lần đưa ra yêu cầu GET CPID_URL, máy khách PHẢI nhận được một CPID mới. Nếu tạo CPID thành công, thì điểm cuối CPID PHẢI trả về phản hồi 200 OK. Nội dung phản hồi PHẢI chứa một phiên bản của CPIDResponse.
{
"cpid": "<CPID_string>",
"ttlSeconds": 2592000
}
CPID được trả về PHẢI hợp lệ trong ttlSeconds giây ngay cả khi người đăng ký đã yêu cầu các CPID khác sau đó. Google khuyên bạn nên sử dụng giá trị TTL là 30 ngày nhưng không được ít hơn 14 ngày để mang lại trải nghiệm tốt nhất cho người dùng. GTAF sẽ mã hoá CPID theo RFC2396 trong các lệnh gọi tiếp theo đến DPA.
Tạo CPID
Cách ĐƯỢC ĐỀ XUẤT để điểm cuối CPID tạo CPID là:
CPID_string = Base64(AES(MSISDN + TimeStamp + language, secret))
Điểm cuối CPID nối MSISDN, ngôn ngữ do máy khách gửi trong tiêu đề Accept-Language, dấu thời gian có độ phân giải cao và mã hoá dấu thời gian đó thông qua AES bằng khoá secret
. Dấu thời gian PHẢI tương ứng với thời gian CPID hết hạn. Đầu ra được mã hoá là Base64. Ngoài ra, khi CPID được dùng trong một URL, bạn PHẢI mã hoá URL để xử lý các ký tự đặc biệt (/+=) được dùng trong Base64. Đặc biệt là khi GTAF gọi DPA hoặc khi DPA gọi Mobile Data Plan Sharing API, CPID PHẢI được mã hoá URL.
Tuỳ thuộc vào tình huống của một nhà khai thác cụ thể, việc triển khai điểm cuối CPID có thể không đơn giản. Một thách thức cụ thể thường gặp phải là việc truy cập vào MSISDN tại điểm cuối CPID. Chúng tôi rất vui khi được chia sẻ những bài học kinh nghiệm trong quá trình tham gia của các nhà khai thác. Vui lòng liên hệ với chúng tôi nếu bạn gặp phải bất kỳ khó khăn nào.
Bộ nhớ CPID
Bạn không cần lưu trữ CPID được tạo bằng cơ chế mô tả ở trên vào cơ sở dữ liệu. Thông tin liên quan để xử lý các lệnh gọi đến DPA có thể được lấy từ CPID.
- Khi DPA nhận được lệnh gọi từ GTAF cho trạng thái hoặc ưu đãi của gói, MSISDN có thể được lấy bằng cách giải mã CPID và trích xuất MSISDN.
- Bạn có thể lấy thời gian hết hạn của CPID bằng cách giải mã CPID rồi trích xuất dấu thời gian hết hạn.
Yêu cầu về phạm vi cung cấp và năng lực
Nếu không truy xuất được CPID, thì ứng dụng sẽ không thể truy cập vào bất kỳ thông tin nào từ Mobile Data Plan API. Vì lý do này, nhà khai thác PHẢI thực hiện các biện pháp cần thiết để đảm bảo tính khả dụng của điểm cuối CPID. Các biện pháp như vậy bao gồm việc có nhiều phiên bản của điểm cuối CPID và các chức năng DPI, đồng thời có tính dự phòng về vật lý, trang web và mạng cho cả hai chức năng, đồng thời đảm bảo rằng tài nguyên và dung lượng hệ thống là đủ. Ngoài ra, điểm cuối CPID cũng như chức năng DPI chèn tiêu đề phải có đủ dung lượng để xử lý tải của tất cả các ứng dụng Google yêu cầu CPID. Điểm cuối CPID có thể sử dụng các giá trị lớn hơn trong trường ttlSeconds
để giảm tần suất tạo CPID.
Các trường hợp lỗi
Nếu xảy ra lỗi, điểm cuối CPID PHẢI trả về một lỗi HTTP có nội dung phản hồi PHẢI chứa một phiên bản của ErrorResponse. Một thông báo lỗi tốt sẽ bao gồm thông tin có thể giúp gỡ lỗi nguyên nhân gây ra lỗi. Ví dụ: trong trường hợp CPID đã hết hạn, việc cung cấp thông tin về thời gian tạo và hết hạn CPID sẽ giúp chúng tôi xác nhận rằng điểm cuối CPID đang hoạt động như dự kiến.
{
"errorMessage": "<error message>",
"cause": "USER_ROAMING"
}
Điểm cuối CPID PHẢI trả về những thông tin sau, tuỳ thuộc vào trường hợp:
- Nếu nhận được yêu cầu CPID cho một người dùng không thuộc mạng của nhà mạng (ví dụ: một người dùng thuộc nhà mạng khác nhưng chuyển vùng trên mạng do điểm cuối CPID này cung cấp) hoặc người dùng chưa chọn chia sẻ thông tin gói dữ liệu với Google, thì điểm cuối CPID PHẢI trả về mã trạng thái HTTP 403 với USER_ROAMING, USER_OPT_OUT hoặc INELIGIBLE_FOR_SERVICE làm nguyên nhân.
- Nếu nhận được yêu cầu CPID có số điện thoại không hợp lệ, thì điểm cuối CPID PHẢI trả về HTTP 400 với nguyên nhân gây ra lỗi INVALID_NUMBER.
- Nếu yêu cầu đến điểm cuối CPID bị sai lệch theo cách khác, thì điểm cuối CPID PHẢI trả về HTTP 400 với ERROR_CAUSE_UNSPECIFIED làm nguyên nhân.
- Đối với các nguyên nhân lỗi khác, mọi mã lỗi HTTP tương thích đều được chấp nhận. Cụ thể, HTTP 500 là nguyên nhân gây lỗi phù hợp cho mọi lỗi nội bộ tại điểm cuối CPID.