解决手心输入法无法登录账号的问题
问题描述
近日在使用电脑处理文字的时候,发现 Windows 10 自带的输入法开始作妖,经常打一个字要卡半天,甚至可以看到电脑自动打字的尴尬场面。因此,我又重新下载回了手心输入法。由于我手机上也是使用的同样的输入法,便想着可以利用输入法带的同步功能来进行个人词库的同步。然而,在实际使用的过程中,我发现手机端的登录比较顺畅,毕竟一直维护,而电脑端的情况则复杂得多。Windows 平台上的最后一次更新还是在 2018.10.18。打开登录界面就会出现错误提示。
但是,手机上使用相同的账号可以登录,所以我判断是电脑端在打开鉴权界面时发生了错误。
错误定位与初步调查
于是使用Fiddler进行抓包,果不其然,在抓取的请求列表中发现了与 openapi.360.cn
通信400的结果。
该应用访问的URL是:
https://openapi.360.cn/oauth2/authorize?client_id=ae2a197a0f3a16cb5b088fbd51db155b&response_type=token&redirect_uri=xinshuru.com&scope=basic&display=desktop
openapi.360.cn
是360的应用开放平台,其官方文档位于 这里。在文档的2.1.2节可以看到,该 OAuth 2.0 接口需要一些参数。
请求参数:
参数名 | 必选 | 介绍 |
---|---|---|
client_id | True | 创建应用时获得的App Key |
response_type | True | 此值固定为“code” |
redirect_uri | False | 授权后要回调的URI,即接收Authorization Code的URI, 其值可以是“oob”。 非“oob”值的redirect_uri所在域名必须与开发者注册应用时所提供的回调地址的域名相匹配 |
scope | False | 以空格分隔的权限列表,若不传递此参数,代表请求默认的basic权限。(目前只有basic权限) |
state | False | 用于保持请求和回调的状态,授权服务器在回调时(重定向用户浏览器到“redirect_uri”时),会在Query Parameter中原样回传该参数 |
oauth_version | False | (可选)版本号,如果填写必须为1.0 |
display | False | 登录和授权页面的展现样式,360桌面应用请传递“desktop”,默认为“default”或空。 |
relogin | False | 仅在实现"使用360账号登陆"功能时才需要传递。当浏览器有360cookie时,传递relogin可展示“当前账号登陆确认页”;relogin值请传递公司域名,如www.360.cn可传递"relogin=360.cn" |
我又直接使用浏览器打开了手心输入法的授权URL,竟然可以直接打开,还很贴心地给出了错误提示:
查询请求参数表格,可以发现 redirect_uri
不是一个必选参数,因此,我直接从 queryString 中删去了该参数,此时,请求URL变成:
https://openapi.360.cn/oauth2/authorize?client_id=ae2a197a0f3a16cb5b088fbd51db155b&response_type=token&scope=basic&display=desktop
再次使用浏览器打开该链接,发现已经可以正常输入账号密码进行登录了:
于是,接下来的问题就是如何将客户端的错误请求更改为修改后的正确请求。
问题解决
既然已经定位到了问题,而且找到了可行的方案,现在的问题就是如何拦截并修改输入法客户端发往服务端的请求。
刚好,我使用的抓包软件 Fiddler 就可以设置自定义拦截规则。
打开自定义规则编辑器后,可以根据注释发现其使用的是 JScript.NET 语言。关于该语言的资料可以在这里找到:JScript.NET Reference。
由于我们现在需要完成的事情是修改客户端请求,于是,我们需要改写自定义规则中关于请求的部分。使用 Fiddler ScriptEditor 菜单栏中的 Go
-to OnBeforeRequest
选项可以直接定位到与请求相关的方法位置。
在方法体的最后,我们加上自己对 openapi.360.cn
的拦截修改规则:
static function OnBeforeRequest(oSession: Session) {
// 如果你之前没有使用过该功能,下面未注释的代码应该位于注释了的代码后面
/*
if (m_AlwaysFresh && (oSession.oRequest.headers.Exists("If-Modified-Since") || oSession.oRequest.headers.Exists("If-None-Match")))
{
oSession.utilCreateResponseAndBypassServer();
oSession.responseCode = 304;
oSession["ui-backcolor"] = "Lavender";
}
*/
if (oSession.HostnameIs("openapi.360.cn")) { // 只处理目标站点
var url = oSession.url; // 当前会话的 URL
var newUrl = url.Replace("redirect_uri=www.xinshuru.com&", String.Empty); // 删去 URL 中 redirect_uri 部分
oSession.url = newUrl; // 替换 URL
}
}
之后,保存(Ctrl
+S
)该文件即可。如果操作正确,应该看到类似下图的界面:
在打开 Fiddler 的情况下,再次打开手心输入法的登录页面,可以看到已经正常打开:
此时输入用户名和密码即可正常登录,使用同步功能了。