---
# System prepended metadata

title: 美团SSO登录过程分析

---

# 美团SSO登录过程分析

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

## SSO登录包
![](https://i.imgur.com/RMogUxq.png)
登录时的数据包如图所示，由于测试次数过多返回包显示need_verify，正常情况下应该是直接登陆成功。对请求包进行测试的结果可以得出，其中主要有三个关键字段：fingerprint、unionid和mtgsig，接下来我们逐一进行分析。

## fingerprint
该字段主要与com.meituan.android.common.fingerprint.info.FingerprintInfo类有关，其中包括大量设备信息：
![](https://i.imgur.com/ywyPMcd.png)
虽然信息项很多，不过app里可以直接调用com.meituan.android.common.fingerprint.FingerprintManager.fingerprint方法一次性采集齐全。

## mtgsig
该字段是对数据包的签名，在com.meituan.android.common.mtguard.MTGuard.requestSignatureForBabelV4方法中生成，参数为网络请求的url和body：
![](https://i.imgur.com/OPOtnS8.png)
继续往下追会发现签名逻辑是在native实现的，遂放弃。但是签名的密钥是写死的，通过这个函数就可以对任意数据包进行签名，因此保护力度相对来说也不是很强。

## unionid
该字段是对用户身份的鉴别，在所有美团系app中共享。那么未登录的美团是如何知道这个ID的呢？在代码中大量搜索之后终于找到下图的位置：
![](https://i.imgur.com/oroGX2X.png)
也就是用deviceInfo向服务器换来的。继续看看其中包含些什么：
![](https://i.imgur.com/V2bJPnu.png)
疑似有很多设备信息，但是抓包测试后发现，唯一有用的字段是一个token：
![](https://i.imgur.com/5BTJoYO.png)
其中又需要设备的品牌、型号和android_id。这个id在安卓上约等于设备的唯一标识符，只要不刷机就不会改变；同时它在同一签名中的应用中是共享的，所以所有美团系的app都会获得同一个android_id，发往服务器之后，服务器就能识别出该设备上还有其他已登录的美团app，从而返回unionid。

## 总结
![](https://i.imgur.com/rEaweNt.png)
整个SSO登录的流程如上图所示。可以看出，整个链条的起点是deviceinfo，因此美团SSO本质上是一个设备信任的机制，通过设备id来识别其中已经登录的美团系应用。这一机制的有效性依赖于设备信息的唯一性和可靠性，其安全性值得进一步研究。
