几种移动app API调用认证方案浅析
最近做的金融项目,app调用的接口需要做一个身份认证,所以找了下目前API services验证的几种方式。之前翻译的一篇文章——[译]移动API安全终极指南中,主要提出了API服务调用验证的问题,通过添加认证,防止API滥用。里面提到了基本的HTTP Basic Authentication、OAuth2.0以及JWT这三种验证方式,同时对这三种认证技术的原理做了大致的梳理。那么这篇文章主要介绍一下这几种认证方式的使用环境以及别的一些方法用于API接口调用认证。
下面就列举一些常见的认证方式和应用,有些大厂的验证方法和常见的验证协议是值得我们学习的。
1. 类似HTTP Basic Authentication
随意在网上搜索公共API服务,比如下图中的百度基站查询的接口。
这种接口一般付费之后会获取到一个apikey,通过apikey进行请求。和HTTP Basic Authentication类似,需要把apikey这个字段写入HTTP header中,服务器验证后,返回相应的结果。
总结:也许是因为公共api的原因吧,所以验证的方式比较简单。下面会讲到,同样是百度的api,在获取地理数据方面,验证方式会严格很多。当然即便是有人恶意抓包获取到付费用户的apikey,也不会造成太大的危害。这类型的接口一般都有当天最大的请求次数,同时用户也很容易发现。

参考:
2. 百度LBS接口加密的方式

上图是百度地图中的API服务,通过IP来获取获取位置信息。
他的加密方式如下:
首先,购买了此服务的开发者会拿到ak(apikey)和sk(secretkey)。接口调用时除了公共参数之外,还需要ak和sn两个参数。sn是一个用特定算法生成的加密串。
sn生成算法
- url后的参数根据键值的字典排序(get不需要),拼接成字符串,utf-8编码。
- 拼接sk后再utf-8编码
- md5编码。
服务器接收到参数后,通过开发者的ak获取到sk,再根据上述操作,生成sn进行比对,验证通过后,调用相应的接口返回结果。
总结:这种方法提到了ak和sk,有一种RSA的味道,安全性显然比上一种强很多。由于私钥是不传播的,只要做好秘钥管理,应该还是比较难破解的。
参考:
3. OAuth2.0
原理不多讲,两次握手获取认证,授权获取相关资源。好像app上用到的不多,最多的应用是在复杂系统的单点登录和第三方登录上(可参考微博、QQ登录,微信公众号授权等)。
参考:
4. 类似OAuth2.0的access_token和refresh_token
熟悉OAuth2.0的开发者都知道,整个授权流程。
- 授权获取code。
- 通过code获取access_token和refresh_token。
- 根据access_token请求资源。
那么问了杭州某移动互联网公司的小伙伴他们认证方案。结果就是简化版的OAuth2.0。
- 用户登录后,后台签发access_token和refresh_token。
- access_token过期后使用refresh_token进行刷新。
- refresh_token过期,app提示重新登录。类似OAuth2.0的重新授权。
5. JWT
JSON Web Token,2015年出的一个标标准(RFC 7519)。
JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.
简单来讲就是一个加密串,和传统的token不同,这个加密串不是nosense,而是可以解密成两段json数据。加密串如下所示,点分三段式结构。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
解密后分为两段json:
{
'typ': 'JWT',
'alg': 'HS256'
}
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
综上JWT的形式是这样的:
[json1 base64加密].[json2 base64加密].[(json1加密后+json2加密后+secret) sha256加密]
总结:详细的原理可以看那篇我翻译的文章。那么和传统的token相比就很有优势了。当移动app登录,API服务器获取用户的ID加上过期时间等信息生成JWT,签发给app。下次app调用API附带JWT,服务端解析后,返回结果。由于所有的信息都存在JWT中,也就不需要使用数据库存储和查询,这些额外的开销了。
参考:
总结
目前看到的认证方式基本上就是以上这几种,当然还有上述几种的组合,例如OAuth2.0+JWT。服务器对API的使用者进行认证,虽然增加了一定的工作量,但是对整个系统的安全性还是有提高的。
几种移动app API调用认证方案浅析的更多相关文章
- api签名认证方案
微信签名算法 token (自己后台配置) nonce:随机数 signature:签名 echostr:返回字符串 https://mp.weixin.qq.com/wiki?t=resource/ ...
- Web APi之认证(Authentication)两种实现方式后续【三】(十五)
前言 之前一直在找工作中,过程也是令人着实的心塞,最后还是稳定了下来,博客也停止更新快一个月了,学如逆水行舟,不进则退,之前学的东西没怎么用,也忘记了一点,不过至少由于是切身研究,本质以及原理上的脉络 ...
- Web APi之认证(Authentication)两种实现方式【二】(十三)
前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...
- 转 Web APi之认证(Authentication)两种实现方式【二】(十三)
前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再废叙述废话. 序言 对于所谓的认证说到 ...
- OAuth2 RFC 6749 规范提供的四种基本认证方案
OAuth2 RFC 6749 规范提供了四种基本认证方案,以下针对这四种认证方案以及它们在本实现中的使用方式进行分别说面. 第一种认证方式: Authorization Code Grant (授权 ...
- 分布式部署下的报表调用 API调用 权限问题以及性能方案
背景描述: 客户的实际情况是需要在具体系统构架前,通过与厂商讨论确定最终的系统架构方案. 需求是客户自己有管理系统,希望建立一个独立的报表服务器,该报表服务器可以对多个管理系统提供报表服务,不知 ...
- ASP.NET Web API 2系列(四):基于JWT的token身份认证方案
1.引言 通过前边的系列教程,我们可以掌握WebAPI的初步运用,但是此时的API接口任何人都可以访问,这显然不是我们想要的,这时就需要控制对它的访问,也就是WebAPI的权限验证.验证方式非常多,本 ...
- API网关设计(一)之Token多平台身份认证方案(转载)
原文:https://segmentfault.com/a/1190000018535570?utm_source=tag-newest 概述 今天咱们面对移动互联网的发展,系统一般是多个客户端对应一 ...
- 关于RESTFUL API 安全认证方式的一些总结
常用认证方式 在之前的文章REST API 安全设计指南与使用 AngularJS & NodeJS 实现基于 token 的认证应用两篇文章中,[译]web权限验证方法说明中也详细介绍,一般 ...
随机推荐
- P1035
P1035 时间限制: 1 Sec 内存限制: 128 MB提交: 87 解决: 36[提交][状态][讨论版] 题目描述 给出一张n*n(n< =100)的国际象棋棋盘,其中被删除了一些点 ...
- MySQL Base
/* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 ---> input pwd /* 数据库存贮引擎 */ InnoDB : 1) ...
- SQL Server Compact/SQLite Toolbox 使用
最近一个嵌入式的数据库用的SqlCe 需要导入到Sqlite, 网上查到了这个工具--SQL Server Compact/SQLite Toolbox.但是在使用的时候遇到了一点小曲折,记录下来给需 ...
- python _winreg模块
详细资料请参考:https://docs.python.org/2/library/_winreg.html 一.常用函数功能介绍 OpenKey() - 打开一个key ############## ...
- Echarts数据可视化series-heatmap热力图,开发全解+完美注释
全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...
- Win10打补丁KB4022725出现0x80073712错误
周末从老家回来折腾电脑,发现又收到了一大堆补丁,其中包括6月累积更新KB4022725.在安装过程中,一不小心手滑碰到了插线板,电脑断电了!!尼玛,这是要悲催的节奏么? 重新上完电开机,开机界面显示正 ...
- Akka 的Actor
从第一篇Akka笔记的介绍中,我们是从很高的高度去观察Akka工具箱中的Actors.在这篇笔记的第二篇,我们会看一下Actors中的消息部分.而且延续上一次的例子,我们还会使用同样的学生与老师的例子 ...
- 为UWP应用开启回环访问权限
最近在项目中遇到UWP调用WCF的需求,考虑到UWP不能寄宿WCF服务(如果能,或者有类似技术,请告知),于是写了一个WPF程序寄宿WCF服务,然后再用UWP调用服务. 写的时候并没有碰到什么问题,直 ...
- mysql执行sql脚本
最近用mysql执行sql脚本,遇到一些问题,顺便记录一下笔记. 首先,先开启mysql服务,创建一个空数据库(脚本里没有创建数据库) 执行脚本有两个方法 1.未连接数据库:在Windows下使用cm ...
- win10 UWP 标题栏后退
设置里,标题栏有后退按钮 在win平板,可以有后退键,手机也有 pc可以在标题栏 在OnLaunched //最后 Windows.UI.Core.SystemNavigationManager.Ge ...