# 美团SSO登录过程分析
## 背景
最近在研究安卓应用的一键登录功能,发现大部分应用的一键登录功能都需要拉起已登录的app进行验证,而美团却能直接识别出已登录的app,十分神奇,因此对这一过程进行逆向分析。
## SSO登录包

登录时的数据包如图所示,由于测试次数过多返回包显示need_verify,正常情况下应该是直接登陆成功。对请求包进行测试的结果可以得出,其中主要有三个关键字段:fingerprint、unionid和mtgsig,接下来我们逐一进行分析。
## fingerprint
该字段主要与com.meituan.android.common.fingerprint.info.FingerprintInfo类有关,其中包括大量设备信息:

虽然信息项很多,不过app里可以直接调用com.meituan.android.common.fingerprint.FingerprintManager.fingerprint方法一次性采集齐全。
## mtgsig
该字段是对数据包的签名,在com.meituan.android.common.mtguard.MTGuard.requestSignatureForBabelV4方法中生成,参数为网络请求的url和body:

继续往下追会发现签名逻辑是在native实现的,遂放弃。但是签名的密钥是写死的,通过这个函数就可以对任意数据包进行签名,因此保护力度相对来说也不是很强。
## unionid
该字段是对用户身份的鉴别,在所有美团系app中共享。那么未登录的美团是如何知道这个ID的呢?在代码中大量搜索之后终于找到下图的位置:

也就是用deviceInfo向服务器换来的。继续看看其中包含些什么:

疑似有很多设备信息,但是抓包测试后发现,唯一有用的字段是一个token:

其中又需要设备的品牌、型号和android_id。这个id在安卓上约等于设备的唯一标识符,只要不刷机就不会改变;同时它在同一签名中的应用中是共享的,所以所有美团系的app都会获得同一个android_id,发往服务器之后,服务器就能识别出该设备上还有其他已登录的美团app,从而返回unionid。
## 总结

整个SSO登录的流程如上图所示。可以看出,整个链条的起点是deviceinfo,因此美团SSO本质上是一个设备信任的机制,通过设备id来识别其中已经登录的美团系应用。这一机制的有效性依赖于设备信息的唯一性和可靠性,其安全性值得进一步研究。