// KioskSessionManager.cs
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;
public class KioskSessionManager : MonoBehaviour
{
private const string RevokeUrl = "https://api.convai.com/user/revoke-token";
// 返回已通过身份验证的住户的新 PAT 的后端端点。
[SerializeField] private string _backendTokenEndpoint = "https://your-backend.com/kiosk/convai-token";
private string _currentToken;
public async void OnResidentLogin(string residentSessionBearer)
{
_currentToken = await FetchTokenAsync(residentSessionBearer);
if (string.IsNullOrEmpty(_currentToken))
{
Debug.LogError("[KioskSessionManager] 令牌获取失败——无法开始会话。");
return;
}
await ConvaiManager.ActiveManager.ConnectAsync();
}
public async void OnResidentLogout()
{
await ConvaiManager.ActiveManager.DisconnectAsync();
if (!string.IsNullOrEmpty(_currentToken))
{
await RevokeTokenAsync(_currentToken);
_currentToken = null;
}
}
private async Task<string> FetchTokenAsync(string residentBearer)
{
using var request = UnityWebRequest.PostWwwForm(_backendTokenEndpoint, string.Empty);
request.SetRequestHeader("Authorization", $"Bearer {residentBearer}");
var operation = request.SendWebRequest();
while (!operation.isDone) await Task.Yield();
if (request.result != UnityWebRequest.Result.Success) return null;
var response = JsonUtility.FromJson<TokenResponse>(request.downloadHandler.text);
return response?.token;
}
private static async Task RevokeTokenAsync(string token)
{
// 注意:撤销需要真实的 API 密钥——此调用也应当
// 通过你的后端代理以获得最大安全性。
// 为清晰起见,这里展示为直接调用;生产环境中请移至后端。
string body = JsonUtility.ToJson(new RevokeBody { apiAuthToken = token });
using var request = new UnityWebRequest(RevokeUrl, "POST");
request.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(body));
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
request.SetRequestHeader("CONVAI-API-KEY", ""); // 生产环境中请通过后端代理提供。
var operation = request.SendWebRequest();
while (!operation.isDone) await Task.Yield();
}
[System.Serializable] private class TokenResponse { public string token; }
[System.Serializable] private class RevokeBody { public string apiAuthToken; }
}