Tài liệu Steamworks
Xác thực người dùng và quyền sở hữu

Tổng quan

Steamworks đưa ra một số phương thức xác thực danh tính người dùng Steam và xác minh quyền sở hữu ứng dụng. Tài liệu này mô tả từng phương thức xác thực được dùng trong các tình huống sau:

Nhận diện một người dùng bên trong Steam

Mỗi người dùng Steam sở hữu mã nhận diện độc nhất là ID số 64-bit, được biết với tên gọi Steam ID của người dùng. Trong các API C++ trên Steamworks, SteamID được chứa bên trong object CSteamID. Bạn có thể lấy SteamID của người dùng hiện tại bằng cách gọi ISteamUser::GetSteamID rồi lấy ID 64-bit bằng cách gọi CSteamID.ConvertToUint64() trên giá trị được trả về.

Phương thức xác thực sau có thể dùng để xác minh SteamID người dùng một cách an toàn.

API được đề cập trong tài liệu này

Ticket phiên

Ticket phiên là ticket có dấu (signed) có thể được dùng để xác minh danh tính người dùng giữa client trò chơi của họ và bất kỳ các client trò chơi nào khác (ví dụ như trong một phiên chơi nhiều người kết nối peer-to-peer), hoặc giữa máy chủ chuyên dụng/máy chủ kiêm người chơi (sử dụng API ISteamGameServer). Các ticket này cũng được dùng để xác minh quyền sở hữu của trò chơi hiện tại kèm nội dung tải thêm (DLC) liên quan, và xem người dùng có bị cấm VAC không (tham khảo Valve Anti-Cheat (VAC) và lệnh cấm chơi).
Ticket phiên có thể dùng để xác minh danh tính người dùng giữa client trò chơi và máy chủ backend bảo mật thông qua API Web Steamworks. Với điều kiện là máy chủ bảo mật có thể thực hiện yêu cầu HTTPS tới partner.steam-api.com.

Ticket ứng dụng mã hóa

Ticket ứng dụng mã hóa có thể được dùng để xác minh danh tính người dùng giữa client trò chơi và máy chủ backend bảo mật. Khác với ticket phiên, xác minh ticket ứng dụng mã hóa không cần máy chủ bảo mật với khả năng thực hiện yêu cầu HTTPS. Thay vào đó, một thư viện C++ và khóa riêng tư, đối xứng được dùng bởi máy chủ bảo mật để xác minh ticket. Steamworks SDK bao gồm cả phiên bản 32-bit và 64-bit của thư viện này cho Windows và Linux trong thư mục public/steam/lib.

Trước khi dùng ticket ứng dụng mã hóa, bạn phải tạo một khóa riêng tư cho mỗi sản phẩm. Bạn có thể làm điều thế bằng cách đến Chỉnh sửa thiết lập Steamworks cho ứng dụng của mình và chọn 'SDK Auth' từ menu thả xuống của thẻ 'Bảo mật'. Khóa này sẽ được liên kết với AppID sản phẩm của bạn và bất kỳ nội dung tải thêm nào cho sản phẩm đó. Để truy cập được vào mục này của Steamworks, một người dùng phải có quyền "Quản lý chữ ký" cho ứng dụng liên quan.
LƯU Ý: Các khóa này phải được lưu trữ an toàn, và không được phân phối trong ứng dụng của bạn dưới bất kỳ hình thức nào!

API Web Steamworks

Steam đưa ra một API web dựa trên HTTP để truy cập một số tính năng của Steamworks. API chứa các phương thức công khai có thể được truy cập từ bất kỳ ứng dụng nào có khả năng thực hiện yêu cầu HTTP, như máy khách hoặc máy chủ trò chơi. API cũng chứa các phương thức được bảo vệ, bắt buộc phải xác thực và truy cập từ các ứng dụng backend chứng nhận tin cậy. Tìm hiểu thêm chi tiết về API Web tại đây.

P2P hoặc máy chủ trò chơi

Ticket phiên

Xác thực người dùng

Sau đây là các bước chi tiết cách dùng ticket phiên để xác minh danh tính người dùng giữa client trò chơi của họ (client A) và một client khác hoặc máy chủ trò chơi (client B):

Một vài lưu ý quan trọng về ticket phiên:
  • Ticket phiên chỉ được sử dụng một lần. ISteamUser::GetAuthSessionTicket phải được gọi cho mỗi client trong phiên chơi nhiều người có yêu cầu ticket.
  • Khi dùng để xác thực người chơi bên trong một phiên chơi nhiều người peer-to-peer, mỗi client trò chơi nên xác minh danh tính của mỗi cilent trò chơi khác trong phiên chơi nhiều người.
  • Khi kết thúc với một ticket phiên, ISteamUser::CancelAuthTicket phải được gọi cho mỗi handle trả về bởi ISteamUser::GetAuthSessionTicket.
  • Khi client A gọi ISteamUser::CancelAuthTicket, client B sẽ nhận một callback ISteamUser::ValidateAuthTicketResponse_t báo rằng ticket của client A không còn hợp lệ.
  • Khi client A rời trò chơi với client B, nếu việc gọi ISteamUser::CancelAuthTicket của client A được xử lý trước lệnh gọi ISteamUser::EndAuthSession của client B, thì client B có thể nhận một callback ISteamUser::ValidateAuthTicketResponse_t báo rằng ticket đã được hủy. Vì có thỏa thuận chung rằng client A đang rời đi, callback có thể được bỏ qua.
  • Tình trạng hệ thống mạng có thể ngăn backend Steam cung cấp một callback đến bên gọi ISteamUser::BeginAuthSession trong một khoảng thời gian không xác định. Bên gọi ISteamUser::BeginAuthSession (client B) không nên giả định rằng bản thân biết danh tính thực sự của client A cho đến khi nhận callback này, nhưng nên cho phép phiên chơi nhiều người tiếp tục.
  • Nếu bên gọi ISteamUser::BeginAuthSession nhận một callback ISteamUser::ValidateAuthTicketResponse_t báo rằng ticket cho client A là không hợp lệ, thì bên gọi phải từ chối tiếp tục phiên chơi nhiều người với client A. Nếu các peer khác trong trò chơi không từ chối chơi với client A, thì bên gọi nên rời phiên chơi nhiều người đó.
  • ISteamGameServer cung cấp các phương thức ticket phiên tương tự để thực hiện việc xác thực giữa client trò chơi và máy chủ trò chơi.

Xác minh quyền sở hữu

Khi sử dụng ticket phiên, Steam sẽ tự động xác minh quyền sở hữu cho AppID hiện tại. Nếu người dùng không sở hữu AppID hiện tại, thì trường m_eAuthSessionResponse của ISteamUser::ValidateAuthTicketResponse_t sẽ được đặt thành k_EAuthSessionResponseNoLicenseOrExpired. Sau khi nhận ticket phiên của người dùng và truyền vào ISteamUser::BeginAuthSession, ISteamUser::UserHasLicenseForApp có thể được dùng để quyết định xem người dùng có sở hữu một phần nội dung tải thêm cụ thể hay không.

Máy chủ backend

Ticket phiên và API Web Steamworks

Xác thực người dùng

Sau đây là các bước trình bày chi tiết cách dùng ticket phiên để xác minh danh tính người dùng, giữa client trò chơi của họ và một máy chủ bảo mật:
  • Client phải lấy một ticket phiên bằng cách gọi ISteamUser::GetAuthTicketForWebApi.
  • Để đảm bảo có ticket hợp lệ, client phải đợi callback ISteamUser::GetTicketForWebApiResponse_t.
  • Client phải gửi ticket phiên của nó tới máy chủ bảo mật.
  • Máy chủ bảo mật phải thực hiện một yêu cầu HTTPS tới partner.steam-api.com và gọi phương thức web ISteamUserAuth/AuthenticateUserTicket, truyền ticket phiên của người dùng dưới dạng chuỗi hex mã hóa UTF-8. Vui lòng lưu ý rằng phương thức này cho phép truyền vào một khóa API Web Steam hoặc một khóa nhà phát hành API Web liên kết với AppID cho ticket được cung cấp. Một bản cập nhật trong tương lai cho API này có thể trả về thêm thông tin cho bên gọi khi cung cấp khóa nhà phát hành API Web.
  • Nếu ticket của người dùng hợp lệ, thì ISteamUserAuth/AuthenticateUserTicket sẽ trả về SteamID 64-bit của người dùng.

Xác minh quyền sở hữu

Khi danh tính của người dùng được xác minh, một máy chủ bảo mật có thể dùng phương thức API Web ISteamUser/CheckAppOwnership để kiểm tra xem người dùng có sở hữu một AppID cụ thể hay không, hoặc gọi ISteamUser/GetPublisherAppOwnership để lấy danh sách tất cả AppID sở hữu bởi người dùng và liên kết với khóa nhà phát hành được cung cấp.

Ticket ứng dụng mã hóa

Xác thực người dùng

Sau đây là các bước chi tiết cách dùng Ticket ứng dụng mã hóa để xác minh danh tính người dùng giữa client trò chơi của họ và một máy chủ bảo mật:

Một ví dụ về cách tích hợp có thể tìm được tìm thấy ở project Ví dụ ứng dụng API Steamworks (Spacewar!) trong SDK. Cụ thể là CSpaceWarClient::RetrieveEncryptedAppTicketCSpaceWarClient::OnRequestEncryptedAppTicket.

Xác minh quyền sở hữu

Steam sẽ chỉ tạo ticket ứng dụng mã hóa cho người dùng sở hữu AppID mà ticket được tạo cho. Sau khi giải mã một ticket ứng dụng mã hóa, máy chủ bảo mật có thể dùng SteamEncryptedAppTicket::BIsTicketForApp để xác minh AppID của ticket khớp với AppID của sản phẩm. Máy chủ cũng có thể dùng SteamEncryptedAppTicket::BUserOwnsAppInTicket để quyết định xem người dùng có sở hữu một phần Nội dung tải thêm (DLC) cụ thể nào hay không.

Xác thực dựa trên trình duyệt web với OpenID

Steam là một nhà cung cấp OpenID, như được mô tả trong yêu cầu của OpenID 2.0. Bên trong trình duyệt web, trang web bên thứ ba có thể dùng OpenID để lấy SteamID của người dùng, và sử dụng làm thông tin đăng nhập cho trang web bên thứ ba, hoặc liên kết với một tài khoản có sẵn trên trang web đó.

Khi dùng OpenID, người dùng bắt đầu trong một trình duyệt web tại trang web của bên thứ ba. Khi người dùng muốn đăng nhập/liên kết tài khoản của họ với trang web đó, thông qua OpenID, trang web điều hướng người dùng tới biểu mẫu đăng nhập trên trang web cộng đồng Steam. Khi người dùng đã nhập thông tin đăng nhập Steam của họ, trình duyệt web của người dùng tự động điều hướng về lại trang web bên thứ ba với một số dữ liệu OpenID cụ thể được nối vào ULR trở về. Thư viện OpenID của trang web có thể dùng dữ liệu này để xác minh và lấy SteamID của người dùng.

Steam cung cấp ảnh sau mà trang web bên thứ ba có thể dùng khi dẫn liên kết tới trang đăng nhập Steam:
sits_large_border.png

sits_large_noborder.png

sits_small.png

Xác thực người dùng

Cách tích hợp OpenID 2.0 của Steam có thể được dùng để liên kết tài khoản Steam của người dùng tới tài khoản của họ trên trang web bên thứ ba.
Bạn có thể tìm thấy danh sách các thư viện OpenID mã nguồn mở tại trang web OpenID. Để sử dụng OpenID nhằm xác minh danh tính người dùng:
  • Thiết lập thư viện OpenID của bạn để dùng URL sau làm URL điểm cuối bên cung cấp OpenID của Steam: https://steamcommunity.com/openid/
  • Sau khi người dùng đã được xác thực, Claimed ID của người dùng sẽ chứa SteamID người dùng. Định dạng Claimed ID của Steam là: http://steamcommunity.com/openid/id/<steamid>.

Xác minh quyền sở hữu

Khi danh tính của người dùng được xác minh, một máy chủ bảo mật có thể dùng phương thức API Web ISteamUser/CheckAppOwnership để kiểm tra xem người dùng có sở hữu một AppID cụ thể hay không, hoặc gọi ISteamUser/GetPublisherAppOwnership để lấy danh sách tất cả AppID sở hữu bởi người dùng và liên kết với khóa nhà phát hành API Web được cung cấp.

Ví dụ

Liên kết tài khoản bên thứ ba tới tài khoản Steam

Tài khoản bên thứ ba có thể được liên kết với tài khoản Steam bằng cách liên kết SteamID của người dùng với tài khoản bên thứ ba.

Có thể lấy SteamID của người dùng một cách bảo mật trong trò chơi hoặc qua trình duyệt web, và sau khi thực hiện liên kết lần đầu, bạn có thể cho phép truy cập an toàn tới tài khoản bên thứ ba chỉ bằng việc xác minh SteamID của người dùng. Làm thế loại bỏ việc yêu cầu người dùng Steam phải đăng nhập thêm lần nữa vào hệ thống tài khoản của bên thứ ba. Ngoài ra, nếu có thể tự động tạo và liên kết tài khoản bên thứ ba mới khi gặp SteamID mới, thì người dùng Steam sẽ không bao giờ cần quan tâm đến việc xác thực lần thứ hai có xảy ra hay không. Thay vào đó, một tài khoản Steam của họ có thể trao quyền truy cập tới tất cả trò chơi, làm đơn giản hóa trải nghiệm người dùng và gỡ bỏ rào cản tiềm tàng trong việc cài và thử trò chơi mới.

Liên kết từ trong trò chơi

Ticket phiên có thể được dùng để xác minh danh tính người dùng giữa client trò chơi và máy chủ backend bảo mật thông qua API Web Steamworks:

Liên kết từ trình duyệt web

Steam hỗ trợ tiêu chuẩn OpenID 2.0 để bạn có thể cho phép người dùng an toàn đăng nhập vào tài khoản Steam của họ từ trang web của bạn và lấy SteamID của họ. Để biết thêm chi tiết cách dùng OpenID với Steam, đến Sử dụng OpenID

Xác minh quyền sở hữu

Khi danh tính của người dùng được xác minh, một máy chủ bảo mật có thể dùng phương thức API Web ISteamUser/CheckAppOwnership để kiểm tra xem người dùng có sở hữu một AppID cụ thể hay không, hoặc gọi ISteamUser/GetPublisherAppOwnership để lấy danh sách tất cả AppID sở hữu bởi người dùng và liên kết với khóa nhà phát hành API Web được cung cấp.

Chuyển từ việc dùng mã CD bên thứ ba sang kiểm tra quyền sở hữu gốc trên Steam

Bản thân Steam có nhiều cách để giúp sản phẩm xác thực người dùng, loại bỏ việc cần đến mã CD bên thứ ba. Chúng tôi tổng hợp một danh sách các trường hợp phổ biến cho mã CD và cách bạn có thể tích hợp từng trường hợp với Steam:

Truy cập diễn đàn riêng tư

Bạn sẽ muốn người dùng đăng nhập trực tiếp với tài khoản Steam của họ bằng OpenID. OpenID sẽ trả về SteamID 64bit của người dùng, mà có thể được dùng với ISteamUser/CheckAppOwnership để xác minh người dùng có sở hữu AppID của bạn. Tìm hiểu thêm chi tiết ở bên trên tại Liên kết tài khoản bên thứ ba tới tài khoản Steam.

Mở khóa phiên bản ngoài Steam, không có DRM của một trò chơi

Dùng OpenID và ISteamUser/CheckAppOwnership (được ghi ở bên trên) để mở khóa nội dung trên trang của bạn. Ngoài ra, bạn có thể tải lên bản build không có DRM, dưới dạng DLC miễn phí nếu muốn.

Phần mềm được bán trên trang web của tôi và mở khóa bằng mã

Bạn sẽ muốn người dùng đăng nhập trực tiếp với tài khoản Steam của họ bằng OpenID. OpenID sẽ trả về SteamID 64bit của người dùng, mà có thể được dùng với ISteamUser/CheckAppOwnership để xác minh người dùng có sở hữu AppID của bạn. Tìm thêm thông tin chi tiết tại Liên kết tài khoản bên thứ ba tới tài khoản Steam bên trên.

Trao vật phẩm trong trò chơi khi đăng ký mã bên thứ ba của bạn

Nếu đang dùng dịch vụ kho đồ Steam, hãy đảm bảo rằng itemdef của vật phẩm được thiết lập đúng cách dưới dạng promo và gọi ISteamInventory::AddPromoItem từ client.
Nếu có backend cho vật phẩm của mình, bạn có thể gọi ISteamUser::GetAuthSessionTicket từ phần mềm trò chơi rồi dùng ISteamUserAuth/AuthenticateUserTicket với ISteamUser/CheckAppOwnership để xác minh quyền sở hữu. Thêm thông tin...

Mã CD quyết định phiên bản nào của phần mềm được mở khóa

Mỗi phiên bản của trò chơi nên có AppID riêng. Từ phần mềm trò chơi, gọi ISteamUser::GetAuthSessionTicket rồi dùng ISteamUserAuth/AuthenticateUserTicket với ISteamUser/CheckAppOwnership để xác minh quyền sở hữu. Thêm thông tin...