概述
最近在做一个Android App,需要从一个Django部署的服务器上读取用户的个人信息。拟使用OAuth2作为授权的方案,简单搜索之后发现Django有一个oauth toolkit的项目,于是就使用了oauth toolkit。在Android系统上,GET和POST等网络操作都交给了Retrofit来完成。这个blog就简单描述一下server side, client side的实现方案,最后给出一个实例。
Authorization server
在OAuth2 的体系中,需要有一个authorization server,用于注册App、用户登录验证、用户授权和access token的分发。我的这个authorization serve调试时即为本机,后端运行的是Django,安装了oauth toolkit,前期也进行了简单调试。为了完成当前的需求,在authorization server上做了几个主要的调整。
(1)需要使用Django自己的User model。
在学习django oauth toolkit时发现,默认情况下oauth toolkit使用Django默认的User model。我目前开发的项目使用的是自定义的User model,之前也尝试了将Django的admin系统配置成custom user model但是最终还是没有成功。目前使用的方案是在custom user model中做一个foreign key,索引到Django自己的User model。
(2)设置上添加本地ip作为allowed server。
为了Android studio的ADV可以与本机的服务器通讯,需要使用本机在局域网中的实际ip地址。配置Django项目的settings.py文件,将本机当前的局域网ip地址加入到ALLOWED_HOSTS里。
(3)修改ALLOWED_REDIRECT_URI_SCHEMES。
为了方便authorization server发回authorization code时Android OS可以直接将Intent发送给我们的App,我们定义redirect uri时最好使用一个custom scheme。一般这个scheme可以是任何有意义的标识,例如公司名,我使用的scheme是huyaoyu,最后redirect uri为huyaoyu://callback。在App的Manifest中添加一个针对这个uri的itent-filter,那么当authorization server返回authorization code时便可以直接得到App的处理。
以上方案的实现,依赖于oauth toolkit支持自定义的scheme。oauth toolkit默认的scheme为http和https。修改默认scheme的方法是在Django的settings.py文件中增加oauth toolkit的配置,具体如下。
OAUTH2_PROVIDER = {
'ALLOWED_REDIRECT_URI_SCHEMES': ['http', 'https', 'huyaoyu'],
}
即将ALLOWED_REDIRECT_URI_SCHEMES定义为增加对huyaoyu的支持。参考了
http://django-oauth-toolkit.readthedocs.io/en/latest/settings.html
(4)REST framework。
在Django框架下使用了REST框架。具体配置参考这里。
但需要注意的是,需将所有oauth2_provider.ext改为oauth2_provider.contrib。这个修正参考了
https://github.com/PhilipGarnero/django-rest-framework-social-oauth2/issues/96
(5)描述各个关键URL。
oauth toolkit提供了一组默认的URL,在当前的项目中通过修改项目总体urls.py来添加相应的url。
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include(router.urls)),
url(r'^o/', include('oauth2_provider.urls', namespace='oauth2_provider')),
url(r'^accounts/', include('django.contrib.auth.urls')),
]
注意以上urlpatterns变量,省略了其他Django application的引用。并且最后一行是关键,oauth toolkit默认将会引导用户到accounts/地址进行登录,此处需要按照上述形式书写。
注册App。
正确配置oauth toolkit之后,首先一步是在authorization server上注册App。目前本机调试时,Django服务器使用的是本机的8080端口。通过访问http://localhost:8080/o/applications,来进行App的注册。o/applications页面如下图所示(localhost可更换为本机局域网ip为192.168.123.96)。
其中RetrofitOAuth是我已经注册