126 lines
4.3 KiB
C#
126 lines
4.3 KiB
C#
|
using System;
|
|||
|
using System.Net;
|
|||
|
using UnityEngine;
|
|||
|
using UnityEngine.UI;
|
|||
|
using TapTap.Login.Internal.Http;
|
|||
|
using System.Collections.Specialized;
|
|||
|
using TapTap.Common.Internal.Utils;
|
|||
|
|
|||
|
namespace TapTap.Login.Internal {
|
|||
|
public class WebController {
|
|||
|
private readonly Action<TokenData> onAuth;
|
|||
|
|
|||
|
private readonly Text titleText;
|
|||
|
private readonly Button jumpButton;
|
|||
|
private readonly Text descriptionText;
|
|||
|
|
|||
|
private HttpListener server;
|
|||
|
|
|||
|
private string clientId;
|
|||
|
|
|||
|
protected string[] permissions;
|
|||
|
|
|||
|
private bool isRunning;
|
|||
|
|
|||
|
public WebController(Transform transform, Action<TokenData> onAuth) {
|
|||
|
this.onAuth = onAuth;
|
|||
|
|
|||
|
titleText = transform.Find("Title").GetComponent<Text>();
|
|||
|
jumpButton = transform.Find("JumpButton").GetComponent<Button>();
|
|||
|
descriptionText = transform.Find("Description").GetComponent<Text>();
|
|||
|
|
|||
|
jumpButton.onClick.AddListener(OnJumpClicked);
|
|||
|
}
|
|||
|
|
|||
|
protected void LoadBasicInfo(string clientId) {
|
|||
|
this.clientId = clientId;
|
|||
|
|
|||
|
ILoginLang lang = LoginLanguage.GetCurrentLang();
|
|||
|
titleText.text = lang.WebLogin();
|
|||
|
Text jumpText = jumpButton.transform.Find("Text").GetComponent<Text>();
|
|||
|
jumpText.text = lang.WebButtonJumpToWeb();
|
|||
|
descriptionText.text = lang.WebNotice();
|
|||
|
}
|
|||
|
|
|||
|
public void Load(string clientId, string[] permissions) {
|
|||
|
LoadBasicInfo(clientId);
|
|||
|
this.permissions = permissions;
|
|||
|
}
|
|||
|
|
|||
|
public void Unload() {
|
|||
|
isRunning = false;
|
|||
|
server?.Stop();
|
|||
|
}
|
|||
|
|
|||
|
protected virtual async void OnJumpClicked() {
|
|||
|
ILoginLang lang = LoginLanguage.GetCurrentLang();
|
|||
|
UI.UIManager.Instance.OpenToast(true,
|
|||
|
lang.WebNoticeLogin(),
|
|||
|
icon: UI.UIManager.WhiteToastInfoIcon);
|
|||
|
|
|||
|
WebLoginRequestManager.Instance.CreateNewLoginRequest(permissions);
|
|||
|
|
|||
|
string url = WebLoginRequestManager.Instance.GetCurrentRequest().GetWebLoginUrl();
|
|||
|
Application.OpenURL(url);
|
|||
|
|
|||
|
// 启动监听
|
|||
|
server = new HttpListener();
|
|||
|
server.Prefixes.Add(WebLoginRequestManager.Instance.GetCurrentRequest().GetRedirectHost());
|
|||
|
server.Start();
|
|||
|
|
|||
|
isRunning = true;
|
|||
|
while (isRunning) {
|
|||
|
try {
|
|||
|
HttpListenerContext context = await server.GetContextAsync();
|
|||
|
Debug.Log($"{context.Request.HttpMethod} {context.Request.Url}");
|
|||
|
context.Response.StatusCode = 200;
|
|||
|
context.Response.Close();
|
|||
|
|
|||
|
if (context.Request.HttpMethod == "OPTIONS") {
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
// 检测 url 合法性
|
|||
|
string code = GetRequestCode(context.Request.Url);
|
|||
|
// 判断授权失败
|
|||
|
if (string.IsNullOrEmpty(code)) {
|
|||
|
// 授权失败
|
|||
|
UI.UIManager.Instance.OpenToast(true,
|
|||
|
$"{lang.WebNoticeFail()},{lang.WebNoticeFail2()}",
|
|||
|
icon: UI.UIManager.WhiteToastErrorIcon);
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
TokenData tokenData = await LoginService.Authorize(clientId, code);
|
|||
|
|
|||
|
onAuth.Invoke(tokenData);
|
|||
|
|
|||
|
return;
|
|||
|
} catch (Exception) {
|
|||
|
continue;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private string GetRequestCode(Uri uri) {
|
|||
|
if (uri == null) {
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
if (!uri.LocalPath.Contains(CodeUtil.GetTapTapOAuthPrefix())) {
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
NameValueCollection queryPairs = UrlUtils.ParseQueryString(uri.Query);
|
|||
|
string code = queryPairs["code"];
|
|||
|
string state = queryPairs["state"];
|
|||
|
if (string.IsNullOrEmpty(state) || string.IsNullOrEmpty(code)) {
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
return state.Equals(WebLoginRequestManager.Instance.GetCurrentRequest().GetState()) ?
|
|||
|
code : null;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|