- REST: https://zh.wikipedia.org/zh/REST
- Play2: http://playframework.com/
- Redis: http://redis.io/
- Access Token: https://en.wikipedia.org/wiki/Access_token
最近要设计一套API
以提供给接入商使用(以下简称corp
),正好可使用Play2
对REST
天然良好的支持。但是在AccessToken
的设计时费了下精力。参考了一些网上的设计,大同小异。最后参考了微信公众号的AccesToken
设计方案,方案见:http://mp.weixin.qq.com/wiki/11/0e4b294685f817b95cbed85ba5e82b8f.html
。
我的方案
- 客户端调用
/api/token
接口,传入client_id
,client_secret
请求参数以生成Access Token
,调用成功将返回JSON,包含两个参数:access_token
,expires_in
。 - 每次HTTP请求,客户端都应在请求参数上附加
access_token
参数 - 在
Play Action
中对access_token
进行校验
因为使用Play2
开发REST
服务,对于Access Token
的校验自然就想到了使用自定义Action
来实现。在自定义Action中,对每次请求参数中的access_token
将进行有效性校验,校验失败会返回错误。自定义Action
代码如下:
1 | case class ClientTokenRequest[A](clientToken: ClientAccessTokenInfo, |
在ApiClientTOkenService().getTokenInfoByAccessToken()
方法中,根据在url上的access_token
参数在redis
中查找相应键值。代码示例如下:
1 | redisClients.withClient { client => |
对于AccessToken
超期的设计,可以使用redis
提供的EXPIRE
功能(http://redis.io/commands/expire)。使用`scala-redis`库,它封装好了在scala下访问redis的各种API。在`set`方法中可以设置键的超时值。
1 | def createClientTokenInfo(corp: Corporation) = { |
使用redis
来保存Access Token
有诸多好处:
- 简单、快捷,不需要自己设计超期、并发等功能。简化代码
- 无状态,便于系统横向扩展