MSN 握手协议和信息交换(2)
6.使用SSL协议连接到longin.passport.com 或者其他服务器443端口
登录名后缀为#msn.com , #compaq.net ,#webtv.net的客户端使用msnialogin.passport.com:443; 登录名后缀为 #hotmail.com 的使用
loginnet.passport.com:443; 其他使用login.passport.com:443.
建议使用如下方法去定身份证验证服务器:
SSL连接到nexus.passport.com 443端口,发送如下命令:
GET /rdr/pprdr.asp HTTP/1.0/r/n
/r/n
服务器将回应如下:
HTTP/1.1 200 OK/r/n
Server: Microsoft-IIS/5.0/r/n
Date: Sun, 27 Sep 2003 11:57:47 GMT/r/n
Connection: close/r/n
PassportURLs:
DARealm=Passport.Net,DALogin=login.passport.com/login2.srf,DAReg=http://register.passport.net/uixpwiz.srf,
Properties=https://register.passport.net/editprof.srf,Privacy=http://www.passport.com/consumer/privacypolicy.asp,GeneralRedir=http://nexusrdr.passport.com/redir.asp,
Help=http://memberservices.passport.net/memberservice.srf, ConfigVersion=11/r/n
Content-Length: 0/r/n
Content-Type: text/html/r/n
Cache-control: private/r/n
/r/n
获取回应中的PassportURLs字段中DALogin部分,即可得到身份验证地址,注意该连接实际上需要在前面加上https://,表示要使用HTTP SSL协议获取相关信息.
login.passport.com 即使需要连接的服务器,用SSL连接到该服务器443端口,即可进行下面的操作
7.在SSL连接中发送如下HTTP请求:
GET /login2.srf HTTP/1.1/r/n
Authorization: Passport1.4 OrgVerb=GET, OrgURL=http%3A%2F%2Fmessenger%2Ecom,sign-in=yourname#hotmail.com.,pwd=******,
lc=1033,id=507,tw=40,fs=1,ru=http%3A%2F%2Fmessenger%2Emsn%2Ecom, ct=1065400856,kpp=1,kv=5,ver=2.1.0173,tpf=15920bfbfabbe0badb47790dc51a54fa/r/n
User-Agent: MSMSGS/r/n
Host: login.passport.com/r/n
Connection: Keep-Alive/r/n
Cache-Control: no-cache/r/n
Authorization 后面跟内容中的"sign-in="后面为登录的登录名称, "pwd="后面为登录名对应的密码,其后内容为前面服务器返回的usr命令后面部分内容
如果成功服务器将返回如下信息:
HTTP/1.1 200 OK/r/n
Server: Microsoft-IIS/5.0/r/n
Date: Sun, 27 Sep 2003 10:43:17 GMT/r/n
PPServer: H AWPPIIS5B084/r/n
Connection:close/r/n
Content-Type: text/html/r/n
Expires: Sun, 27 Sep 2003 10:42:18 GMT/r/n
Cache-Control: no-cache/r/n
cachecontrol:no-store/r/n
....(此处省略)
Set-Cookie: MSPPre=jefgeskenstesting#hotmail.com; HTTPOnly=domain=passport.com;path=/;Expires=Wed,30-Oct-1980 16:00:00 GMT
Authentication-Info: Passport1.4 da-status=success,tname=MSPAuth,tname=MSPProf,tname=MSPSec,from-PP='t=50y
HvVtsqDmntb4B4z*UOKIkjWzyERUzYHRn07bmd*!4LS4w!JLRB95JjopamqbRz1APVAq*hqeYScQIt*Se21yA$$&p=5ArrhL7LNEzou
oqpC9kIoeqvBm4wzKnISD3QzZOxOIcz6iJ5w33IQJZ3tQjq9*4z*16MQ6y6xYtth7QdEQb*Z1kRHUH6pm6sJsUXfbfNbrhdu5oOJzdIjNXGVSC5Ffheo
GrHtrxMp1ZgMgeDcLY0yx6iYoO!OEfX1pQ24avzKIQDA7ME7pLMFTKtvp5NJHdBI75Szr3P4d37Y$',
ru=http://messenger.msn.com/r/n
Content-Length: 0/r/n
/r/n
/r/n
其中最重要的是Authentication-Info字段返回的值,取得'from-pp' 后面单引号中的部分内容
如果失败服务器返回如下信息 如果失败需要连接其他服务器尝试)
HTTP/1.1 401 Unauthorized/r/n
Server: Microsoft-IIS/5.0/r/n
Date: Sun, 27 Sep 2003 11:58:15 GMT/r/n
PPServer: H: LAWPPIIS6B077/r/n
Connection: close/r/n
Content-Type: text/html/r/n
Expires: Mon, 20 Oct 2003 07:57:14 GMT/r/n
Cache-Control: no-cache/r/n
cachecontrol: no-store/r/n
Pragma: no-cache/r/n
P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"/r/n
PassportConfig: ConfigVersion=11/r/n
WWW-Authenticate: Passport1.4
da-status=failed,srealm=Passport.NET, ts=-3,propmpt,cburl=http://www.passportimages.com/XPPassportLogo.gif,
cbtxt=Type%20your%20e-mail%20address%20and%20password%20correctly.%20If%20you%20
haven%E2%80%99t%20registered%20with%20.NET%20Passport20click%20the%20Get%20a%20.NET%20Passport%20link./r/n
Content-Length:390/r/n
/r/n
同时服务器可能将客户端重定向到其他地方,这是返回如下信息:
HTTP/1.1 302 Found/r/n
Server: Microsoft-IIS/5.0/r/n
PPServer: H: LAWPPLOG5C006/r/n
Connection: close/r/n
Content-Type: text/html/r/n
Expires: Sun, 27 Sep 2003 11:57:32 GMT/r/n
Cache-Control: no-cache/r/n
cachecontrol: no-store/r/n
Pragma: no-cache/r/n
P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"/r/n
Authentication-Info: Passprot1.4 da-status=redir/r/n
Location: https://loginnet.passport.com/login2.srf?lc=1033/r/n
/r/n
其中 https://loginnet.passport.com/login2.srf?lc=1033就是重定向URL,
这个时候需要按照这个步开始的方向访问新的服务器loginnet.passport.com 用
login2.srf?lc=1033代替login2.srf
8关闭SSL连接,回到notification 服务器连接上,向服务器在此发送usr
命令:
USR 7 TWN S t=50y
HvVtsqDmntb4B4z*UOKIkjWzyERUzYHRn07bmd*!4LS4w!JLRB95JjopamqbRz1APVAq*hqeYScQIt*Se21yA$$&p=5ArrhL7LNEzou
oqpC9kIoeqvBm4wzKnISD3QzZOxOIcz6iJ5w33IQJZ3tQjq9*4z*16MQ6y6xYtth7QdEQb*Z1kRHUH6pm6sJsUXfbfNbrhdu5oOJzdIjNXGVSC5Ffheo
GrHtrxMp1ZgMgeDcLY0yx6iYoO!OEfX1pQ24avzKIQDA7ME7pLMFTKtvp5NJHdBI75Szr3P4d37Y$
命令含义和前面一样,注意的是第三个参数为S, 第四个参数就是上面SSL连接中获取的Authentication-Info 字段中from-pp部分.
如果密码正确notification 服务器将返回usr命令, OK作为第二个参数
USR 7 OK yourname#hotmail.com /302/204/345/276/220/346/263/263 1 0/r/n
其中第三个参数是用户登录名,第四个参数是用户的昵称(UTF-8值);第五个代表身份验证是否通过,1 表示true; 第六个如果是MSNP7以上为0,其他为1
其他将返回一些错误.
同时服务器将返回如下信息:
MSG Hotmail Hotmail 438/r/n
MIME-Version: 1.0/r/n
Content-Type: text/x-msmsgsprofile; charset=UTF-8/r/n
EmailEnabled: 1/r/n
MemberIdHigh: 90496/r/n
MemberIDLow: -1587598413/r/n
lang_preference: 2052/r/n
preferredEmail:/r/n
country: CN/r/n
PostalCode: /r/n
Gender: /r/n
Kid:0/r/n
Age:/r/n
BDayPre:/r/n
Birthday:/r/n
Wallet: /r/n
Flags:1027/r/n
sid:507/r/n
kv:5/r/n
MSPAuth:
50yHvVtsqDmntb4B4z*UOKIkjWzyERUzYHRn07bmd*!4LS4w!JLRB95JjopamqbRz1APVaq*hqeYScQIt*Se21yA$$/r/n
ClientIP: 211.91.101.105/r/n
ClientPort: 64942/r/n
/r/n
各字段含义如下:
LoginTime: 登录的时间,UNIX时间戳.
EmailEnabled: 当前帐号是否新邮件通知,仅仅对hotmail.com msn.com 的用户有效,1或者0
MemberIdHigh:90496, 联系人ID最大值
MemberIdLow: -1587598413,联系人ID最小值
lang_preference: 2052,首选语言代号(同LocalID)
preferredEmail: 用户的主要邮件地址,一般为空
country: CN, 用户国家代号两位字母
PostalCode: 用户邮编
Gender: 用户性别,m或者f或者u,u表示未知
Kid:0 您的帐号是否是未成年人的帐号,0或者1
Age:年龄
BDayPre: 距离您的生日天数
Birthday: 生日,使用数字表示
Wallet: 是否有微软的Wallet服务,0或者1
Flags: 1027 未知
sid: 507 hotmail登录的一个数字, 一般为507
kv: 5 hotmail登录的另一个数字,一般为5
MSPAuth: SSL连接中取得Authentication-Info 字段中from-pp部分中的t的值
ClientIP:211.91.101.105 告诉客户端实际上连接到服务器上的IP
ClientPort: 29703 告诉客户端实际上连接服务器上的端口
注意:实际返回的ClientPort不是真正的端口号,需要用函数ntohc转换,其原型为:
function ntohc(ClientPort: Integer): Integer
begin
Result := ((ClientPort and 255)*256) + ((ClientPort and 65280) div 256);
end;
端口号在HTTP类型的代理中将为0,在服务器返回的信息中ClientIP特别有用,它用来排断客户端是否位于
防火墙,网关,代理服务器后面,决定客户端是否直接和服务器连接,如果ClientIP不是客户端所在机器IP地址列表中
即可判断,客户端位于防火墙后面,它需要在文本传输中的"Connectivity"字段使用,同时在MSNP9 中(Conn-Type字段)
可以去定连接类型,方法如下:
将返回的IP地址,端口连接到服务器上的IP地址端口作比较,根据结果得出:
IP地址相同端口相同: Direct_Connect
IP地址相同端口不同: Port-Restrict-NAT
IP地址不同端口相同: IP-Restrict-NAT(局域网连接多为这种情况)
IP地址不同端口不同: Symmetric-NAT或者Unknow-NAT
其他客户端不能确定的情况可以定为Unknow-Connect
下一节将介绍同步本地联系人列表,欲知详情,请听下回分解.
登录名后缀为#msn.com , #compaq.net ,#webtv.net的客户端使用msnialogin.passport.com:443; 登录名后缀为 #hotmail.com 的使用
loginnet.passport.com:443; 其他使用login.passport.com:443.
建议使用如下方法去定身份证验证服务器:
SSL连接到nexus.passport.com 443端口,发送如下命令:
GET /rdr/pprdr.asp HTTP/1.0/r/n
/r/n
服务器将回应如下:
HTTP/1.1 200 OK/r/n
Server: Microsoft-IIS/5.0/r/n
Date: Sun, 27 Sep 2003 11:57:47 GMT/r/n
Connection: close/r/n
PassportURLs:
DARealm=Passport.Net,DALogin=login.passport.com/login2.srf,DAReg=http://register.passport.net/uixpwiz.srf,
Properties=https://register.passport.net/editprof.srf,Privacy=http://www.passport.com/consumer/privacypolicy.asp,GeneralRedir=http://nexusrdr.passport.com/redir.asp,
Help=http://memberservices.passport.net/memberservice.srf, ConfigVersion=11/r/n
Content-Length: 0/r/n
Content-Type: text/html/r/n
Cache-control: private/r/n
/r/n
获取回应中的PassportURLs字段中DALogin部分,即可得到身份验证地址,注意该连接实际上需要在前面加上https://,表示要使用HTTP SSL协议获取相关信息.
login.passport.com 即使需要连接的服务器,用SSL连接到该服务器443端口,即可进行下面的操作
7.在SSL连接中发送如下HTTP请求:
GET /login2.srf HTTP/1.1/r/n
Authorization: Passport1.4 OrgVerb=GET, OrgURL=http%3A%2F%2Fmessenger%2Ecom,sign-in=yourname#hotmail.com.,pwd=******,
lc=1033,id=507,tw=40,fs=1,ru=http%3A%2F%2Fmessenger%2Emsn%2Ecom, ct=1065400856,kpp=1,kv=5,ver=2.1.0173,tpf=15920bfbfabbe0badb47790dc51a54fa/r/n
User-Agent: MSMSGS/r/n
Host: login.passport.com/r/n
Connection: Keep-Alive/r/n
Cache-Control: no-cache/r/n
Authorization 后面跟内容中的"sign-in="后面为登录的登录名称, "pwd="后面为登录名对应的密码,其后内容为前面服务器返回的usr命令后面部分内容
如果成功服务器将返回如下信息:
HTTP/1.1 200 OK/r/n
Server: Microsoft-IIS/5.0/r/n
Date: Sun, 27 Sep 2003 10:43:17 GMT/r/n
PPServer: H AWPPIIS5B084/r/n
Connection:close/r/n
Content-Type: text/html/r/n
Expires: Sun, 27 Sep 2003 10:42:18 GMT/r/n
Cache-Control: no-cache/r/n
cachecontrol:no-store/r/n
....(此处省略)
Set-Cookie: MSPPre=jefgeskenstesting#hotmail.com; HTTPOnly=domain=passport.com;path=/;Expires=Wed,30-Oct-1980 16:00:00 GMT
Authentication-Info: Passport1.4 da-status=success,tname=MSPAuth,tname=MSPProf,tname=MSPSec,from-PP='t=50y
HvVtsqDmntb4B4z*UOKIkjWzyERUzYHRn07bmd*!4LS4w!JLRB95JjopamqbRz1APVAq*hqeYScQIt*Se21yA$$&p=5ArrhL7LNEzou
oqpC9kIoeqvBm4wzKnISD3QzZOxOIcz6iJ5w33IQJZ3tQjq9*4z*16MQ6y6xYtth7QdEQb*Z1kRHUH6pm6sJsUXfbfNbrhdu5oOJzdIjNXGVSC5Ffheo
GrHtrxMp1ZgMgeDcLY0yx6iYoO!OEfX1pQ24avzKIQDA7ME7pLMFTKtvp5NJHdBI75Szr3P4d37Y$',
ru=http://messenger.msn.com/r/n
Content-Length: 0/r/n
/r/n
/r/n
其中最重要的是Authentication-Info字段返回的值,取得'from-pp' 后面单引号中的部分内容
如果失败服务器返回如下信息 如果失败需要连接其他服务器尝试)
HTTP/1.1 401 Unauthorized/r/n
Server: Microsoft-IIS/5.0/r/n
Date: Sun, 27 Sep 2003 11:58:15 GMT/r/n
PPServer: H: LAWPPIIS6B077/r/n
Connection: close/r/n
Content-Type: text/html/r/n
Expires: Mon, 20 Oct 2003 07:57:14 GMT/r/n
Cache-Control: no-cache/r/n
cachecontrol: no-store/r/n
Pragma: no-cache/r/n
P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"/r/n
PassportConfig: ConfigVersion=11/r/n
WWW-Authenticate: Passport1.4
da-status=failed,srealm=Passport.NET, ts=-3,propmpt,cburl=http://www.passportimages.com/XPPassportLogo.gif,
cbtxt=Type%20your%20e-mail%20address%20and%20password%20correctly.%20If%20you%20
haven%E2%80%99t%20registered%20with%20.NET%20Passport20click%20the%20Get%20a%20.NET%20Passport%20link./r/n
Content-Length:390/r/n
/r/n
同时服务器可能将客户端重定向到其他地方,这是返回如下信息:
HTTP/1.1 302 Found/r/n
Server: Microsoft-IIS/5.0/r/n
PPServer: H: LAWPPLOG5C006/r/n
Connection: close/r/n
Content-Type: text/html/r/n
Expires: Sun, 27 Sep 2003 11:57:32 GMT/r/n
Cache-Control: no-cache/r/n
cachecontrol: no-store/r/n
Pragma: no-cache/r/n
P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"/r/n
Authentication-Info: Passprot1.4 da-status=redir/r/n
Location: https://loginnet.passport.com/login2.srf?lc=1033/r/n
/r/n
其中 https://loginnet.passport.com/login2.srf?lc=1033就是重定向URL,
这个时候需要按照这个步开始的方向访问新的服务器loginnet.passport.com 用
login2.srf?lc=1033代替login2.srf
8关闭SSL连接,回到notification 服务器连接上,向服务器在此发送usr
命令:
USR 7 TWN S t=50y
HvVtsqDmntb4B4z*UOKIkjWzyERUzYHRn07bmd*!4LS4w!JLRB95JjopamqbRz1APVAq*hqeYScQIt*Se21yA$$&p=5ArrhL7LNEzou
oqpC9kIoeqvBm4wzKnISD3QzZOxOIcz6iJ5w33IQJZ3tQjq9*4z*16MQ6y6xYtth7QdEQb*Z1kRHUH6pm6sJsUXfbfNbrhdu5oOJzdIjNXGVSC5Ffheo
GrHtrxMp1ZgMgeDcLY0yx6iYoO!OEfX1pQ24avzKIQDA7ME7pLMFTKtvp5NJHdBI75Szr3P4d37Y$
命令含义和前面一样,注意的是第三个参数为S, 第四个参数就是上面SSL连接中获取的Authentication-Info 字段中from-pp部分.
如果密码正确notification 服务器将返回usr命令, OK作为第二个参数
USR 7 OK yourname#hotmail.com /302/204/345/276/220/346/263/263 1 0/r/n
其中第三个参数是用户登录名,第四个参数是用户的昵称(UTF-8值);第五个代表身份验证是否通过,1 表示true; 第六个如果是MSNP7以上为0,其他为1
其他将返回一些错误.
同时服务器将返回如下信息:
MSG Hotmail Hotmail 438/r/n
MIME-Version: 1.0/r/n
Content-Type: text/x-msmsgsprofile; charset=UTF-8/r/n
EmailEnabled: 1/r/n
MemberIdHigh: 90496/r/n
MemberIDLow: -1587598413/r/n
lang_preference: 2052/r/n
preferredEmail:/r/n
country: CN/r/n
PostalCode: /r/n
Gender: /r/n
Kid:0/r/n
Age:/r/n
BDayPre:/r/n
Birthday:/r/n
Wallet: /r/n
Flags:1027/r/n
sid:507/r/n
kv:5/r/n
MSPAuth:
50yHvVtsqDmntb4B4z*UOKIkjWzyERUzYHRn07bmd*!4LS4w!JLRB95JjopamqbRz1APVaq*hqeYScQIt*Se21yA$$/r/n
ClientIP: 211.91.101.105/r/n
ClientPort: 64942/r/n
/r/n
各字段含义如下:
LoginTime: 登录的时间,UNIX时间戳.
EmailEnabled: 当前帐号是否新邮件通知,仅仅对hotmail.com msn.com 的用户有效,1或者0
MemberIdHigh:90496, 联系人ID最大值
MemberIdLow: -1587598413,联系人ID最小值
lang_preference: 2052,首选语言代号(同LocalID)
preferredEmail: 用户的主要邮件地址,一般为空
country: CN, 用户国家代号两位字母
PostalCode: 用户邮编
Gender: 用户性别,m或者f或者u,u表示未知
Kid:0 您的帐号是否是未成年人的帐号,0或者1
Age:年龄
BDayPre: 距离您的生日天数
Birthday: 生日,使用数字表示
Wallet: 是否有微软的Wallet服务,0或者1
Flags: 1027 未知
sid: 507 hotmail登录的一个数字, 一般为507
kv: 5 hotmail登录的另一个数字,一般为5
MSPAuth: SSL连接中取得Authentication-Info 字段中from-pp部分中的t的值
ClientIP:211.91.101.105 告诉客户端实际上连接到服务器上的IP
ClientPort: 29703 告诉客户端实际上连接服务器上的端口
注意:实际返回的ClientPort不是真正的端口号,需要用函数ntohc转换,其原型为:
function ntohc(ClientPort: Integer): Integer
begin
Result := ((ClientPort and 255)*256) + ((ClientPort and 65280) div 256);
end;
端口号在HTTP类型的代理中将为0,在服务器返回的信息中ClientIP特别有用,它用来排断客户端是否位于
防火墙,网关,代理服务器后面,决定客户端是否直接和服务器连接,如果ClientIP不是客户端所在机器IP地址列表中
即可判断,客户端位于防火墙后面,它需要在文本传输中的"Connectivity"字段使用,同时在MSNP9 中(Conn-Type字段)
可以去定连接类型,方法如下:
将返回的IP地址,端口连接到服务器上的IP地址端口作比较,根据结果得出:
IP地址相同端口相同: Direct_Connect
IP地址相同端口不同: Port-Restrict-NAT
IP地址不同端口相同: IP-Restrict-NAT(局域网连接多为这种情况)
IP地址不同端口不同: Symmetric-NAT或者Unknow-NAT
其他客户端不能确定的情况可以定为Unknow-Connect
下一节将介绍同步本地联系人列表,欲知详情,请听下回分解.