安装mobileconfig配置描述文件及完成Authenticate和Token Update功能

分类: 首页- >MDM专栏 | 阅读: 7859 | 评论: 0 | 2014-07-24 16:12:17 
摘要:安装完成了mobileconfig后,对于“Check In URL”的两次请求:Authenticate和Token Update非常重要,我们后面的所有命令都需要其请求返回来的数据作为参数

导读:安装完成了mobileconfig后,对于“Check In URL”的两次请求:Authenticate和Token Update非常重要,我们后面的所有命令都需要其请求返回来的数据作为参数,例如:Token、PushMagic等数据。下面我们具体介绍一下对于Authenticate和Token Update的请求步骤:

1、MDM的Authenticate请求:

As the MDM profile is being installed, the device will attempt to connect to the MDM server.It first sends a basic “Authenticate” request to the Check In URL, providing the device’s Universal Device Identifier (UDID) and the Push Notification topic.(翻译:当设备安装了MDM的描述文件后,设备马上就会去请求MDM Server,首先会通过“Check In URL”发送一个“Authenticate”这样的请求,并传递设备的UDID和推送的Topic参数给设备)。
设备的“Authenticate”请求数据例如:
---------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
 <dict>
   <key>MessageType</key>
   <string>Authenticate</string>
   <key>Topic</key>
   <string>com.example.mdm.pushcert</string>
   <key>UDID</key>
   <string> [ redacted ] </string>
 </dict>
</plist>
---------------------------------------------------------------------------
我们收到设备返回的数据后,我们需要给设备返回一个空的plist格式文件,例如:
---------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
  </dict>
</plist>
---------------------------------------------------------------------------
这样我们就能获取设备的UDID和Topic数据,设备的认证完成,可以参考如下代码片段:
---------------------------------------------------------------------------
/**保存返回的Token、PushMagic数据**/
Map<String, String> plistMap = MdmUtils.parseAuthenticate(info.toString());
String Topic = plistMap.get(MdmUtils.Topic);
String UDID = plistMap.get(MdmUtils.UDID);
if (mdm == null) {
      mdm = new Mdm();
}
mdm.setDeviceId(deviceId);
mdm.setUdid(UDID);
mdm.setTopic(Topic);
mdm.setControl("1");
dbService.saveOrUpdate(mdm);
/**返回一个空的pList格式的文件**/
String blankPList = MdmUtils.getBlankPList();
System.out.println("-------------------Authenticate start---------------");
HttpServletResponse response = (HttpServletResponse) ControllerContext.getContext().getHttpResponse();
response.setHeader("content-type", "application/xml;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
String configTitle = "Mbaike_Blank";
response.setHeader("Content-Disposition", "attachment; filename=" + configTitle + ".plist");
PrintWriter sos = response.getWriter();
System.out.println("-------------------Authenticate end---------------");
sos.write(blankPList);
sos.flush();
sos.close();
---------------------------------------------------------------------------
---------------------------------------------------------------------------
/**
  * 空的pList格式的文件(用户checkIn认证时候的返回)
  * @return
  */
 public static String getBlankPList(){
    StringBuffer backString = new StringBuffer();
    backString.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
    backString.append("<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\"");
    backString.append("\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">");
    backString.append("<plist version=\"1.0\"><dict></dict></plist>");
    return backString.toString();
 }
---------------------------------------------------------------------------
2、设备的Token Update请求(很重要:获取Token、PushMagic等信息):
After receiving this response, the client sends the server a “TokenUpdate” request,containing three key pieces of identifying information:
? PushMagic- a unique token the MDM server sends with each push request
? Token- a unique token that identifies the device to the APNS service
? UnlockToken- an escrow key used to clear the passcode on the device.
(翻译:当设备收到第一步“Authenticate”返回的空的plist数据后,设备马上会想MDM Server发送一个“TokenUpdate”的请求,这里包含有:PushMagic、Token、UnlockToken三个返回参数,PushMagic:MDM Server向设备推送请求时的唯一令牌;Token:设备接收推送消息的唯一令牌;UnlockToken:用于清除设备密码的一个令牌数据);

设备会发送一个“”数据,例如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
 <dict>
   <key>MessageType</key>
   <string>TokenUpdate</string>
   <key>PushMagic</key>
   <string> [ redacted uuid string ] </string>
   <key>Token</key>
   <data> [ 32 byte string, base64 encoded, redacted ] </data>
   <key>Topic</key>
   <string>com.example.mdm.pushcert</string>
   <key>UDID</key>
   <string> [ redacted ] </string>
   <key>UnlockToken</key>
   <data>[ long binary string encoded in base64, redacted ]</data>
  </dict>
</plist>

这样我们就获取了:PushMagic、Token、UnlockToken三个重要的数据。下面,我们按照文档上的描述,直接返回一个“200”状态回去就行了。
在第2步中,我们MDM Server端的代码片段如下:

System.out.println("-------------------TokenUpdate start---------------");
/**保存返回的数据**/
Map<String, String> plistMap = MdmUtils.parseTokenUpdate(info.toString());
String UnlockToken = plistMap.get(MdmUtils.UnlockToken);
String UDID = plistMap.get(MdmUtils.UDID);
String Topic = plistMap.get(MdmUtils.Topic);
String OriToken = plistMap.get(MdmUtils.Token);
String PushMagic = plistMap.get(MdmUtils.PushMagic);
if (mdm == null) {
         mdm = new Mdm();
 }
mdm.setDeviceId(deviceId);
mdm.setUdid(UDID);
mdm.setTopic(Topic);
mdm.setControl("2");
mdm.setUnlockToken(UnlockToken);
/**组装新的Token数据**/
String Token = MdmUtils.parseToken(OriToken);
mdm.setToken(Token);
mdm.setPushMagic(PushMagic);
dbService.saveOrUpdate(mdm);
System.out.println("-------------------TokenUpdate end---------------");
/**空返回**/
toMDMResult(Response.Status.OK.getStatusCode(), null);

另外,我们获取的Token不能直接使用,需要解码处理,参见如下解码工具方法:

   /**
     * 将通过TokenUpdate获取的原始Token转化成16进制新的Token
     * @param OriToken
     * @return
     * @throws IOException
     */
    public static String parseToken(String OriToken) throws IOException{
        BASE64Decoder decoder = new BASE64Decoder();
        byte[] decodedBytes = decoder.decodeBuffer(OriToken);
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < decodedBytes.length; ++i) {
            buf.append(String.format("%02x", decodedBytes[i]));
        }
        String Token = buf.toString();
        return  Token;
    }

总结:我们在这两步中获取到了后面很重要的几个参数:Token、PushMagic、UnLockToken,其中,Token是不能直接使用的,我们要先Base64解码,然后转化成16进制的字符串。
 声明:www.mbaike.net 博客文章版权属于作者,受法律保护。未经作者同意不得转载。
标签 mobileconfig Authenticate TokenUpdate
相关搜索

共有 0 条网友评论

还木有留言,还不抢沙发?

发布评论:

昵称: 邮箱: 验证码:
文明上网,理性发言!
© 移动互联百科(www.mbaike.net) | WAP站点 | 站长QQ:459104018 | 备案号:蜀ICP备14008230号-2