前言
百度地图作为地图服务提供商,为开发者提供了丰富多样的 API 接口。然而,在使用百度地图 API 时,SN 权限签名这一环节常常成为开发过程中的技术难点,也是确保应用安全稳定使用百度地图服务的关键所在。本文将深入探讨 Java 开发者如何高效、准确地搞定百度地图 SN 权限签名实践。
一、SN 签名简介
1、SN 签名是什么
SN 权限签名是一种安全机制,用于验证应用对百度地图 API 的访问请求是否合法。通过为每个请求生成唯一的签名,百度地图能够有效防止未经授权的访问和滥用。在之前的接口调用中,我们仅在开放平台中申请了应用,并且分配了 AK,而接口的调用也是通过 AK 来完成的。简要过程如下所示:
开发者首先需要在百度地图开放平台创建应用,然后获取应用访问 key 即 AK。然后就可以进行应用开发,比如地点检索、路径导航、天气服务等,在调用这些服务时必须要携带 AK 在每次服务调用时进行访问请求。
以地点检索服务为例,在官方的开发者文档中对于 SN 的描述如下:
| sn | 开发者的权限签名。sn 校验说明 | string(50) | 可选,若开发者所用 AK 的校验方式为 SN 校验时该参数必须。 | | timestamp | 设置 sn 后该值必填。 | string(50) | 设置 sn 后该值必填。 |
2、如何开启 SN 签名
sn 作为保护开发者的一种重要手段,如何在创建应用时开启 SN 签名呢?这里将重点讲解。首先我们登录百度地图开发者平台,进入到控制台程序中。
在这里界面可以看到自己创建的应用列表,为了不影响之前的应用,我们创建一个新的应用。点击红色框中的'创建应用'按钮来创建新的应用。说明,如果我们选择修改原来的应用的严重模式,那么会影响之前的验证模式,因此大家一定要谨慎选择,根据自己的实际情况来进行设置,如果只是测试的话,没有关系,随时切换,创建一个应用即可。点击创建应用后,弹出以下界面:
按照要求填写好应用名称、应用类型(请注意:'服务端 AK'不再支持浏览器端使用;在浏览器端使用,请选择'浏览器端 AK',例如 JavaScript API 只支持浏览器类型 AK。对于以前申请的服务端 AK,不变更即不受影响,仍支持浏览器端使用;如更新老的服务端 AK,再次保存,则按新创建 AK 处理,不再支持浏览器端使用。)、启用服务、请求校验方式(默认是使用 IP 限制,这里我们选择 SN 校验),信息输入完成后点击提交即可。
请记住这里的 SK,在后面的签名中还会使用到的。到此,就创建好了一个支持 SN 签名的应用,后面就会使用这个应用来访问相关接口。
3、SN 签名算法
计算 sn 跟参数对出现顺序有关,get 请求请使用 LinkedHashMap 保存<key,value>,该方法根据 key 的插入顺序排序;post 请使用 TreeMap 保存<key,value>,该方法会自动将 key 按照字母 a-z 顺序排序。这里有一个至关重要的知识点,即请求的参数,在实际的地图接口中,我们传入的顺序是一定的,怎么样保证这个签名的有效性呢?开发者会根据自己的应用 SK 和 AK,加上请求参数生成一个 SN,然后将请求发送到服务端,如果两者匹配,请求返回,反之会报 APP SN,SERVER 类型 APP 有两种校验方式 IP 校验和 SN 校验,当用户请求的 SN 和服务端计算出来的 SN 不相等的时候提示 SN 校验失败。这里以检索接口为例,简单讲一下 SN 的签名算法,请求的接口是 V2 版本的检索接口,地址如下:
https://api.map.baidu.com/place/v2/search?
请求的参数如下:
String query = "36"; String region = "158";// 158 表示长沙市 String scope = "2"; String output = "json"; String ret_coordtype = "WGS84"; int page_size = 20; int page_num = 0;


