文/赵龙 李秀红 马玉爽
OAuth 2.0让统一身份认证更安全
文/赵龙 李秀红 马玉爽
如今,越来越多的Web应用和App应用都涉及到用户的参与,用户的统一身份认证和数据权限安全问题愈加严重,利用稳定的Web架构和认证机制,才能保障数据安全。
目前常见的身份认证方法有基于秘密信息的身份认证方法和基于物理安全性的身份认证方法,而基于秘密信息中的口令核对应用最广泛,OAuth协议是目前比较流行的基于口令核对的用户验证与授权协议。Django是Python的一个开源Web开发框架.REST(Representational State Transfer,表述性状态转移)是当前Web体系结构的一种架构风格。
REST与Django REST framework服务
REST(Representational State Transfer),即“表述性状态转移”,由Roy Thomas Fielding博士在2000年的博士论文中首次提出。REST将需要操作的事物抽象为资源,同时给每一个资源赋予唯一的资源标识符URI,并通过HTTP处理和传输资源状态。
Restful Web服务也叫Restful Web API,是符合Rest风格的轻量级Web服务,其主要特点有所有资源都有唯一URI作为识别符、使用标准方法、资源多重表述、无状态通信。通过 HTTP协议中定义的方法(POST,GET,PUT,DELETE)对资源进行CRUD(Create, Retrieve, Update, Delete)操作。
Django REST framework是基于Django这个Web框架的REST模块,主要提供了资源的API操作,封装各种对数据资源的操作,提供包括数据序列化、状态表述等各种形式的数据反馈。
OAuth2.0协议
OAuth协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的用户名与密码等敏感信息,即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权。允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。OAuth2.0是OAuth协议的二代版本,为Web应用,桌面应用和手机应用等提供专门的认证流程。
REST服务和OAuth2.0结合的开放平台
2007年5月份,Facebook宣布改版,最早提出了开放平台的概念,Restful Web应用和OAuth2.0结合的开放平台是一个流行的模式,国内外各大网站都推出了自己的开放API服务。
本文主要是采用Django REST framework下的OAuth toolkit实现站内数据的认证,实现用户的统一身份认证。采用token的实现方式,用户在首次连接服务器时,服务器验证用户信息,生成并返回令牌,当用户再次请求数据的时候附带先前服务器提供的token令牌,令牌中存储有此次登录的有效时间,范围以及用户信息。通过REST的设计模式,对不同的数据资源设计不同的URI,对资源进行的操作由客户端指定的URI和HTTP协议动词的组合来完成数据的高效操作。同时通过Token验证返回给用户对应的数据相关权限,实现数据的安全访问。
Django REST framework模型分析
Django REST framework框架是建立在Django框架之上的,属于Django框架的一个中间件,主要实现数据的API操作接口,同时提供多种功能包括权限控制与用户认证。具体实现数据在客户端和服务器之间的安全传输,分为以下步骤:
A:数据模型建立(model 数据序列化)。对于数据进行建模,通过Django的models.py文件建立需要进行数据交互的数据原型。对于数据模型建立序列化方法,方法数据的传输。
B:创建数据访问接口。对于不同的数据资源建立不同的数据访问接口,对于同一数据资源建立对应的HTTP协议中定义的方法(PUT,GET,POST,DELETE)。
C:API访问路由设置。对不同的数据资源建立不同的路由URI,按照REST的思想,同一数据资源拥有相同的URI。
Django OAuth Toolkit建立OAuth2.0认证
图1 OAuth2.0认证流程
相比于传统的OAuth2.0的复杂的配置认证,Django OAuth Toolkit完美地提供了方便快捷的OAuth2.0的支持, OAuth2.0的基本流程如图1所示。
客户端从资源拥有者(最终用户)那里请求授权。授权请求能够直接发送给资源拥有者,或者间接地通过授权服务器发送请求,然后资源拥有者为客户端授权,给客户端发送一个访问许可(Authorization Code),客户端出示自己的私有证书(client_ id和client_secret)和上一步拿到的访问许可,来向授权服务器请求一个访问令牌,授权服务器验证客户端的私有证书和访问许可的有效性,如果验证有效,则向客户端发送一个访问令牌,访问令牌包括许可的作用域、有效时间和一些其他属性信息,客户端出示访问令牌向资源服务器请求受保护资源,资源服务器对访问令牌做出响应。
在Django REST framework的OAuth Toolkit支持下,基本的用户统一身份认证及数据资源权限控制实现流程主要有以下不同:对于当前的Django应用添加OAuth2支持oauth2_provider,在OAuth的认证菜单内注册应用程序获取client_id和client_ secret,相当于第三方应用在平台注册。后面请求受控制资源时携带申请的令牌即可。
认证模型整体架构设计
为了实现用户的统一身份认证和数据权限控制,采用的基本框架是Django支撑的Django REST framework和Django OAuth Toolkit,基本流程如图2。
认证模型实现步骤
以用户个人信息的获取更新为例解释Django OAuth Toolkit下的OAuth统一身份认证及数据资源权限控制。
1.建立用户数据模型
通过Django的model建立用户的相关属性,通过Django集成的命令建立数据库存储,将用户信息存入数据库等待API调用。
2. 第三方应用向应用平台注册应用
图2 Django REST framework和OAuth2.0结合的认证流程
在Django框架下的OAuth2.0中注册一个应用,名称为wireless, Client type为Confidential, Authorization grant type为Resource Owner Password Credentials Grant,获取对应的client_id和client_secret。
3.在网站注册用户
在资源服务器注册用户,用户名为hacker,并填写相关信息。
4.第三方应用请求用户授权读取用户信息
第三方应用,以手机App为例,引导用户hacker在授权页面填写用户名密码以获取用户的授权。
5.用户授权给第三方客户端
用户hacker在客户端的授权页输入用户名和密码,通过调用登录API(POST /api/ login/),向平台提交授权用户的用户名和密码以及客户端的配置信息。
其中需要用到的access_token 即为客户端访问用户数据的令牌,expired_in即为令牌的有效时间,时间单位为秒,scope即为该令牌拥有的权限对数据进行读写操作。
6.客户端携带申请的access_token访问用户信息
资源服务器检查客户端提交的access_ token,通过REST的URI标识路由到控制器。然后通过认证函数OAuth2Authentication和权限控制函数permission_classes验证access_token有效性,如果access_token有效则资源服务器返回相关数据给客户端,否则返回认证失败。
如果用户票据正确则返回用户信息,否则提示失败。
此外OAuth2.0也提供了refresh_token,如果客户端保存的access_token过期,当资源服务器检查到该access_token过期时,客户端可以向授权服务器出示client_id和client_ secret以及refresh_token,授权服务器鉴定正确性和有效性,鉴定有效则给客户端分发一个新的访问令牌access_token。
OAuth2.0是目前国际通用的授权方式,认证与授权的流程简单、安全,提供了安全的统一身份认证,通过令牌的方式保护了数据的权限安全,其也提供了用户多账号通用和资源共享的机制。但是在Web应用中,缺少对数据的高效封装操作,Django REST framework作为优秀的Web框架Django下的REST框架,通过特定的URI来表示不同的资源,利用HTTP的协议动词(POST,GET,PUT,DELETE)实现对资源的操作,但是缺少数据安全性的控制。本文通过前面的实例分析和测试,得出在Django REST framework框架下包含OAuth2.0认证的Django OAuth Toolkit可以结合二者的优点,在保证数据的高效封装访问,提供数据的ORM操作和序列化的同时,又确保了数据的安全性,对用户的统一身份认证做了深入封装,是下一代开放平台优先的选择。
(作者单位为北京师范大学)