移动端实践单点登录知识储备之Oauth2.0
Oauth2.0是我们目前一种非常常用的认证授权方式。在oauth2.0中有如下四种角色:
- resource owner资源所有者:比如我们在各个子业务系统中需要与用户挂钩的各种信息,比如微博公司,他们存储着我们所有人的微博信息,那这就是一种资源owner.
- resource server资源服务器:保存资源的服务器,别人要访问受限制的资源就要出示 Access Token(访问另牌)。
- client客户端:一个经过授权后,可以代表资源所有者访问资源服务器上受限制资源的一方。比如开发者开发的应用。
- authorization server授权服务器:对 资源所有者进行认证,认证通过后,向 客户端发放 Access Token(访问另牌)。
在我的上一篇博客中,我们很容易能够看到对于多个系统的账号合并信息,我们就是需要这么一种来管理各种资源权限并且能够正常识别认证用户的机制。那么oauth2.0我认为就是这么一种非常好的权限管理和控制机制。
在oauth2.0中,我们要想获取access_token,oauth认证支持我们有以下几种方式获取access_token:
- 授权码模式(authorization code)
- 简化模式(implicit)
- 密码模式(resource owner password credentials)
- 客户端模式(client credentials)
在这里我们着重介绍一下授权码的认证模式,这也是目前我们国内三方开放平台中用到最常用的一种认证方式。
授权码模式的认证流程,主要是通过下面的几个步骤来进行授权验证:
- 获取authorization code
通过我们拿到的appkey来获取一个未认证的授权码
然后让用户主动根据自己的账户的信息来认证并同意授权。
➜ ~ curl https://open.www.5288z.com/oauth2/authorize.php\?response_type\=code\&client_id\=zhangyuqing\&state\=zhelishistate
{"status":"0","msg":"\u8bf7\u6c42\u6210\u529f","re":{"code":"e184416fa0b775f95d7473da1d7252766e0509bd"}}%
2.根据authorization code来获取access_token
curl -u zhangyuqing:mima https://open.www.5288z.com/oauth2/token.php -d 'grant_type=authorization_code&code=9520e2e85fa44bbede2b5f04f66f0193d6e4dbe5'
{"access_token":"6039b8d097e1475b9c1449357e92b64eebc75e6f","expires_in":3600,"token_type":"Bearer","scope":"lanmu","refresh_token":"1f23dc81947428a0cf6fee2e44fb17bc73978a7e"}%
拿到access_token后,我们就可以利用access_token来访问需要授权资源服务器中的资源了。我这里用一个接口的信息掩饰如下:
// 当没有授权的时候返回的信息如下:
➜ ~ curl https://open.www.5288z.com/open/getlanmu.php
{"status":"-1","msg":"\u672a\u901a\u8fc7oauth\u8ba4\u8bc1,\u8bf7\u5148\u5f97\u5230\u6388\u6743\u518d\u8bbf\u95ee\u6570\u636e","re":null}%
当添加了授权码的时候,返回的信息如下:
➜ ~ curl https://open.www.5288z.com/open/getlanmu.php -d 'access_token=6039b8d097e1475b9c1449357e92b64eebc75e6f'
{"status":0,"msg":"\u8bf7\u6c42\u6210\u529f","re":[{"lanmu":"\u65f6\u5149\u7684\u58f0\u97f3"},{"lanmu":"\u6d41\u5e74\u7d6e\u8bed"},{"lanmu":"\u5927\u57ce\u5c0f\u7231"},{"lanmu":"\u6211\u60f3\u5bf9\u4f60\u8bf4"},{"lanmu":"\u542c\u5f71\u6cca\u5fc3"},{"lanmu":"\u6d45\u8c08\u6e05\u5531"},{"lanmu":"\u7279\u522b\u8282\u76ee"},{"lanmu":"\u6709\u6ca1\u6709\u4e00\u9996\u6b4c"},{"lanmu":"\u82b1\u8bed\u65f6\u5149"},{"lanmu":"\u8bb0\u5fc6\u788e\u7247"},{"lanmu":"\u65f6\u5149\u6f2b\u65c5"}]}%