开放api接口平台都会有appid、appkey、appsecret

作者:肖旭
链接:https://www.zhihu.com/question/27814664/answer/140795440
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我来回答你吧:
app_id, app_key, app_secret , 对于平台来说, 需要给你的 你的开发者账号分配对应的权限:
1. app_id 是用来标记你的开发者账号的, 是你的用户id, 这个id 在数据库添加检索, 方便快速查找
2 app_key 和 app_secret 是一对出现的账号, 同一个 app_id 可以对应多个 app_key+app_secret, 这样 平台就可以分配你不一样的权限, 比如 app_key1 + app_secect1 只有只读权限 但是 app_key2+app_secret2 有读写权限.. 这样你就可以把对应的权限 放给不同的开发者. 其中权限的配置都是直接跟app_key 做关联的, app_key 也需要添加数据库检索, 方便快速查找
3 至于为什么 要有app_key + app_secret 这种成对出现的机制呢, 因为 要加密, 通常 在首次验证(类似登录场景) , 你需要用 app_key(标记要申请的权限有哪些) + app_secret(密码, 表示你真的拥有这个权限) 来申请一个token, 就是我们经常用到的 access_token, 之后的数据请求, 就直接提供access_token 就可以验证权限了.

上述3点说的有点多哈, 不知道讲明白了没, 顺便再说一下简化的场景:
1 省去 app_id, 他默认每一个用户有且仅有一套权限配置, 所以直接将 app_id = app_key , 然后外加一个app_secret就够了.
2 省去app_id 和 app_key, 相当于 app_id = app_key = app_secret, 通常用于开放性接口的地方, 特别是很多地图类api 都采用这种模式, 这种模式下, 带上app_id 的目的仅仅是统计 某一个用户调用接口的次数而已了. 


AppID:应用的唯一标识AppKey:公匙(相当于账号)AppSecret:私匙(相当于密码)

token:令牌(过期失效)


使用方法

1. 向第三方服务器请求授权时,带上AppKey和AppSecret(需存在服务器端)

2. 第三方服务器验证AppKey和AppSecret在DB中有无记录

3. 如果有,生成一串唯一的字符串(token令牌),返回给服务器,服务器再返回给客户端

4. 客户端下次请求敏感数据时带上令牌

个人理解,欢迎指正



作者:hao chen
链接:https://www.zhihu.com/question/30919485/answer/140324889
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

当然,我可以帮您编写一个使用SM国密生成appkeyappsecret的Java代码。以下是示例代码: ``` import java.security.*; import javax.crypto.*; import javax.crypto.spec.*; public class SMAppKeyGenerator { private static final String ALGORITHM = "SM3withSM2"; private static final String KEY_ALGORITHM = "EC"; private static final String PROVIDER = "GM"; public static void main(String[] args) throws Exception { String appId = "your_app_id"; String appSecret = generateAppSecret(); String appKey = generateAppKey(appId, appSecret); System.out.println("AppId: " + appId); System.out.println("AppSecret: " + appSecret); System.out.println("AppKey: " + appKey); } private static String generateAppSecret() throws Exception { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM, PROVIDER); keyPairGenerator.initialize(new ECGenParameterSpec("sm2p256v1")); KeyPair keyPair = keyPairGenerator.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); byte[] encodedPrivateKey = privateKey.getEncoded(); return bytesToHexString(encodedPrivateKey); } private static String generateAppKey(String appId, String appSecret) throws Exception { byte[] appIdBytes = appId.getBytes("UTF-8"); byte[] appSecretBytes = hexStringToBytes(appSecret); byte[] data = new byte[appIdBytes.length + appSecretBytes.length]; System.arraycopy(appIdBytes, 0, data, 0, appIdBytes.length); System.arraycopy(appSecretBytes, 0, data, appIdBytes.length, appSecretBytes.length); MessageDigest messageDigest = MessageDigest.getInstance(ALGORITHM, PROVIDER); byte[] digest = messageDigest.digest(data); return bytesToHexString(digest); } private static String bytesToHexString(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { String hex = Integer.toHexString(b & 0xFF); if (hex.length() == 1) { sb.append('0'); } sb.append(hex); } return sb.toString(); } private static byte[] hexStringToBytes(String hexString) { int len = hexString.length() / 2; byte[] bytes = new byte[len]; for (int i = 0; i < len; i++) { bytes[i] = (byte) Integer.parseInt(hexString.substring(i * 2, i * 2 + 2), 16); } return bytes; } } ``` 这段代码使用了SM2算法生成了一个公私钥对,然后使用SM3withSM2算法对AppIdAppSecret进行哈希计算,得到AppKey。请注意,这里使用了Bouncy Castle作为Java加密库的提供者,因为它支持SM算法。如果您的Java环境中没有安装Bouncy Castle,您需要先下载并安装它。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值