CAS对接Open edX

Open edX的第三方登录是作为一个django app存在的,配置过程如下。

LMS配置过程

##安装CAS的Client、Mapper
进入edXapp环境,下载CAS的Client、Mapper

CAS Client安装目录在下面的地址

Mapper的安装目录在下面的地址

开启edX特性支持CAS登陆

修改 /edx/app/edxapp/lms.env.json文件如下

修改 /edx/app/edxapp/edx-platform/lms/envs/common.py如下

同时

修改 /edx/app/edxapp/edx-platform/lms/envs/aws.py如下

修改 /edx/app/edxapp/edx-platform/lms/urls.py如下

增加一个nextpage属性,当用户通过CAS登陆后自动跳转到dashboard。

修改 /edx/app/edxapp/edx-platform/common/djangoapps/external_auth/views.pydjango_cas.views改为 cas.view

修改CAS Client配置文件

在cas目录中找到 backends.py

默认的Client并没有返回附加的属性,寻找下面的函数

在其返回值增加用户附加属性。也就是代码中的tree。修改如下
原版函数结尾:

改为下面这样:


寻找下面的片段

改为

分析:
username, authentication_response = _verify(ticket, service)这一行是用户认证后返回的用户名和附加属性的XML树。
对接逻辑如下(try之后的部分):
尝试根据用户名获取用户的model。当用户不存在时候,如果设置了自动创建用户。那么就自动根据用户名创建一个用户的model,如果定义了属性解析器、那么根据CAS认证返回的XML树解析用户的属性,对应更改user的model。之后保存model并注册用户。

问题:
1. 是否应该让用户每次通过CAS登陆后都去解析用户的属性来保持edX中用户的资料和CAS系统提供的一致?
2. user和profile的关系是什么?
3. 用户属性的更改是通过更改user还是更改profile?

更改Mapper使其能正确解析CAS Server返回的XML树

修改 /edx/app/edxapp/venvs/edxapp/lib/python2.7/site-packages/mitx_cas_mapper/__init__.py

打印源码中的attr结果如下

所以分析、CAS Server返回结果结构大致如下。

修改源代码中原有的XPath、对应实际返回的XML Tag即可正常解析XML

CMS配置过程

开启edX特性支持CAS登陆

修改 /edx/app/edxapp/cms.env.json文件如下

修改 /edx/app/edxapp/edx-platform/cms/envs/common.py如下,增加一行

修改 /edx/app/edxapp/edx-platform/cms/envs/aws.py如下

修改 /edx/app/edxapp/edx-platform/cms/urls.py如下

增加一个nextpage属性,当用户通过CAS登陆后自动跳转到dashboard。

修改 /edx/app/edxapp/edx-platform/common/djangoapps/external_auth/views.pydjango_cas.views改为 cas.view

其他的说明

如果要对CAS返回的结果进行解析,需要更改mapper的代码。在mapper的安装目录下可以看到python脚本。在这里给出一个示例,本校CAS将会返回学号等登录信息,需要自动填写姓名、邮箱。解析脚本参考如下。

0 Comments
Leave a Reply