通过本篇可以基本掌握使用token,下面就来一步一步开始学会使用吧!
Token(计算机术语)
在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。
数据处理
token其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据操作。例如在USB1.1协议中定义了4类数据包:token包、data包、handshake包和special包。主机和USB设备之间连续数据的交换可以分为三个阶段,第一个阶段由主机发送token包,不同的token包内容不一样(暗号不一样)可以告诉设备做不同的工作,第二个阶段发送data包,第三个阶段由设备返回一个handshake包。
(网络上)基于 Token 的身份验证方法
使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:
- 客户端使用用户名跟密码请求登录
- 服务端收到请求,去验证用户名与密码
- 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
- 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
- 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
- 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
下面是个人的理解:
1.登录的时候(或者第一次打开APP的时候),登录成功之后,我们需要给他分配一个token。(1)token可以是文件的形式存着;(2)也可以存在数据库,但是存放在数据库,我个人不推荐,因为每次调用api接口都会对比,这样做法会加重服务器压力;(3)用redis存放token。
2.登录之后,我们要返回token,让安卓或者ios去保存这个token,以后每次操作都携带token去请求接口。
3.接下来就是我们要用它传给我们的token去对比,如果符合,那就正常返回数据,否则就返回一个标识,告诉app说这个token不符合,需要重新登录。
下面我们来看一下token的具体使用,在开发中我的需求是用户第一次打开我们的APP的时候就获取到一个token,然后保存到本地,这样在下一次打开后我们就能根据token来判断用户的信息(如果用户注册,则把用户信息和token在后台绑定):
1:首先获取token(这里是当打开APP的时候的一个Activity中)
//初始化数据,获得应用的token并且保存
public void initData() {
//判断有没有旧的token,AndroidFileUtil这个工具类在下面的代码中
String myToken = AndroidFileUtil.readFileByLines(getCacheDir().getAbsolutePath() + "/" + DataConfig.TOKEN_FILE_NAME);
if (!TextUtils.isEmpty(myToken)) {
Log.d("WelcomeActivity","Token: "+myToken);
} else {
APIConfig.getDataIntoView(new Runnable() {
@Override
public void run() {
String member = "member";
Map<String, String> map = new HashMap<>();
map.put("grantType", member);
map.put("token","");
map.put("appId","");
map.put("appSecret","");
//对传入的数据进行加密
String paramJson = EncryptUtil.encrypt(map);
//下面的是获取token的服务器地址,项目中应该根据具体的请求地址
String url = "xxxhttp://45.5.175.255/shop/api/xxxtoken/refresh.do";
String rs = HttpUtil.GetDataFromNetByPost(url,
new ParamsBuilder().addParam("paramJson", paramJson).getParams());
//对数据进行解密到我们的一个保存token的类中(UserToken类)
final UserToken result = EncryptUtil.decrypt(rs, UserToken.class);
if (result != null && result.getResult() == APIConfig.CODE_SUCCESS) {
//保存我们获取的token在文件中,方便下次获取,这个工具也在下面
APIUtil.saveToken(result.getData());
} else {
//下面的是自己写的一个工具类,也可以用Toast弹窗消息
ToastUtil.toastByCode(result);
}
}
});
}
}