简书地址:https://www.jianshu.com/p/35c2083a90d7
前言:个人在学院易班技术部工作,要求开发的项目要和易班结合,于是我在原来的在线问卷系统中添加了易班联合登录模块,这也是本篇文章介绍的重点。

1. 前期准备

易班开放平台:https://open.yiban.cn/,申请开发者账号,创建网络应用,这里不过多介绍这个。
为了方便本地测试,我们把网站和回调地址设置成本地地址:

2. 网站后端开发

  • 弄懂易班的授权机制

授权机制的具体介绍:
https://open.yiban.cn/wiki/index.php?page=授权机制说明

归纳起来大体分成四个部分:

  • 重定向至授权页面
  • 页面返回用户令牌code
  • 用用户令牌code换区用户授权凭证
  • 用access_token调用API获取相关信息。

前两步重定向由前端完成,获取用户令牌后的操作在后端完成,目的是从API中获取易班id和用户名

  • 创建APP

命令行执行python manage.py startapp oauth创建联合登录的应用

  • 配置url

Prj目录下的urls.py的urlpattens中增加path('oauth/', include('oauth.urls')),
oauth的urls.py

from django.urls import path
from . import viewsurlpatterns = [path('login/', views.yb_login, name='yb_login'),path('check/', views.yb_check, name='yb_check'),path('bind/', views.yb_bind, name='yb_bind'),
]
  • 编辑models

由于之前已经建立好用户登录注册模型了,为了减少改动,我们创建一个新模型将用户和易班id关联。

models.py

from django.db import models
from django.contrib.auth.models import User# Create your models here.
class OAuthyb(models.Model):"""yb and User Bind"""user = models.ForeignKey(User, on_delete=models.DO_NOTHING)   # 关联用户信息表yb_id = models.CharField(max_length=64)   # yb_id
  • 实现重定向到授权页面

在oauth目录下创建新文件oauth_client.py,这个文件用来封装联合登录类
编辑oauth_client.py

import json
from urllib import parse
import requestsclass OAuth:def __init__(self, APPID, APPSECRET, CALLBACK):self.app_id = APPIDself.key = APPSECRETself.redirect_url = CALLBACKdef get_auth_url(self):params = {'client_id': self.app_id,'redirect_uri': self.redirect_url,'state': 1,}url = 'https://oauth.yiban.cn/code/html?%s' % parse.urlencode(params)return url

这里把联合登录封装成一个类,含有一些必须属性,同时get_auth_url这个方法用于获取重定向url,为什么这样操作,参照官方文档第一步。

settings添加

APPID=XXX
APPSECRET=XXX
CALLBACK=XXX
# 这里的都是你申请的信息,注意要大写,否则会出现很多BUG

编辑views.py

from django.shortcuts import render
from django.conf import settings
from .oauth_client import OAuth
from django.shortcuts import HttpResponseRedirect
from .models import OAuthyb
from django.contrib import auth
from django.urls import reverse
from .forms import YBLoginForm# Create your views here.def yb_login(request):oauth_yb = OAuth(settings.APPID, settings.APPSECRET, settings.CALLBACK)url = oauth_yb.get_auth_url()return HttpResponseRedirect(url)

前面这些引入的文件,有的是后面用到的,这一步完成后,就可以重定向到授权页面了:
访问本地页面 http://127.0.0.1:8000/oauth/login

授权完成后会携带用户令牌重定向到设置的CALLBACK页面

  • 编写回调页面处理函数获取access_token和user_info

首先修改前面创建的OAuth类文件:
oauth_client.py

import json
from urllib import parse
import requestsclass OAuth:def __init__(self, APPID, APPSECRET, CALLBACK):self.app_id = APPIDself.key = APPSECRETself.redirect_url = CALLBACK#获取授权页面的urldef get_auth_url(self):params = {'client_id': self.app_id,'redirect_uri': self.redirect_url,'state': 1,}url = 'https://oauth.yiban.cn/code/html?%s' % parse.urlencode(params)return url#获取access_token的值,写入类并回调 def get_access_token(self, code):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36','X-Requested-With': 'XMLHttpRequest'}params = {'code': code,'client_id': self.app_id,'client_secret': self.key,'redirect_uri': self.redirect_url,}url = 'https://oauth.yiban.cn/token/info?%s' % parse.urlencode(params)response = requests.get(url=url, headers=headers)response.encoding = 'utf-8'result = json.loads(response.text)access_token = str(result['access_token'])self.access_token = access_tokenreturn access_token# 获取用户信息,转换为json文件并回调def get_yb_info(self):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36','X-Requested-With': 'XMLHttpRequest'}params = {'access_token': self.access_token,}url = 'https://openapi.yiban.cn/user/me?%s' % parse.urlencode(params)response = requests.get(url=url, headers=headers)response.encoding = 'utf-8'result = json.loads(response.text)return result

增加的方法功能都写在注释里面了,所有的流程都是参照着官方文档来的,用到了requests库来在后端获取access_token和用户信息

编辑views.py

def yb_check(request):request_code = request.GET.get('code')oauth_yb = OAuth(settings.APPID, settings.APPSECRET, settings.CALLBACK)access_token = oauth_yb.get_access_token(request_code)print('access_key=%s' % access_token)# 获取用户信息infos = oauth_yb.get_yb_info()if infos['status'] == 'success':user_id = infos['info']['yb_userid']user_name = infos['info']['yb_username']# ORM查找易班id是否已绑定id_models = OAuthyb.objects.filter(yb_id=user_id)# 已绑定,直接登录if id_models:user = id_models[0].useruser.backend = 'django.contrib.auth.backends.ModelBackend'auth.login(request, user)return HttpResponseRedirect(reverse('home'))# 未绑定,携带信息跳转到跳转到绑定页面else:url = '%s?user_id=%s&user_name=%s' % (reverse('yb_bind'), user_id, user_name)return HttpResponseRedirect(url)# 获取用户信息失败返回错误信息else:context = {}context['message'] = infos['info']['msgCN']return render(request, 'message.html', context)

思路就是获取access_token后携带access_token获取用户信息,然后按提示绑定账户

  • 用户绑定易班id

使用djangoform。只含有和已注册用户绑定,绑定未注册账户尚未完善

新建forms.py

from django import forms
from django.contrib.auth.models import User
from django.contrib import auth
from .models import OAuthybclass YBLoginForm(forms.Form):username = forms.CharField(label='用户名',widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder':'请输入用户名'}))password = forms.CharField(label='密码',widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder':'请输入密码'}))user_id = forms.CharField(label='', widget=forms.HiddenInput(attrs={'id': 'user_id'}))def clean(self):username = self.cleaned_data['username']password = self.cleaned_data['password']user = auth.authenticate(username=username, password=password)if user is None:raise forms.ValidationError("用户名或者密码不正确")else:self.cleaned_data['user'] = userreturn self.cleaned_datadef clean_user_id(self):user_id = self.cleaned_data['user_id']if OAuthyb.objects.filter(user_id=user_id).exists():raise forms.ValidationError('该ID已绑定其他账号')return user_id

views.py增加

def yb_bind(request):if request.method == 'POST':login_form = YBLoginForm(request.POST)if login_form.is_valid():user_id = login_form.cleaned_data['user_id']user = login_form.cleaned_data['user']oauth_obj = OAuthyb()oauth_obj.yb_id = user_idoauth_obj.user = useroauth_obj.save()auth.login(request, user)return HttpResponseRedirect(reverse('home'))else:login_form = YBLoginForm()context = {}context['login_form'] = login_formcontext['user_id'] = request.GET.get('user_id')context['user_name'] = request.GET.get('user_name')return render(request, 'yb_login_bind.html', context)

yb_login_bind.html

{% extends 'base.html' %}
{% block title%}在线填表系统|登录
{% endblock %}
{% block css_header %}<link rel="stylesheet" href="/static/home.css">
{% endblock %}
{% block content %}<div class="row"><div class="col-xs-4 col-xs-offset-4"><div class="panel panel-default"><div class="panel-heading"><h3 class="panel-title">登录</h3></div><div class="panel-body"><h4> 欢迎你,易班用户<b class="text-primary">{{ user_name }}</b><br>请绑定后继续</h4>{% if not user.is_authenticated %}<form action="" method="POST">{% csrf_token %}{% for field in login_form %}<label for="{{ field.id_for_label }}">{{ field.label }}</label>{{ field }}<p class="text-danger">{{ field.errors.as_text }}</p>{% endfor %}<span class="pull-left text-danger">{{ login_form.non_field_errors }}</span><input type="submit" value="登录" class="btn btn-default pull-right"></form>{% else %}<div><span>用户  <strong>{{ user.username }}</strong>  已登录,请勿重复登录</span></div>{% endif %}</div></div></div></div><script src="/static/bootstrap-3.3.7/js/jquery.min.js"></script><script type="text/javascript">$(document).ready(function() {$('#user_id').val({{ user_id }})});</script>
{% endblock %}

绑定页面:

  • 最终效果:

代码github地址:待更新

用Django2.1开发易班联合登录相关推荐

  1. 易班APP登录密码加密、sig逆向分析

    1.最近闲来无事,听说有一个易班app登录好练手,就去试了一下看看. 先抓个包看看 然后使用了腾讯的壳,脱一下,我这边用的是BlackDex64. 脱完壳之后导出来直接导出来拖到jadx,就是现在这个 ...

  2. 如何使用java调用易班登录API获取个人账号信息(一)

    关于这篇文章: 笔者近期和小伙伴接了校方的一个小小小项目,要求使用易班APP的账号,这意味着需要调用易班官方的登录API.下面介绍使用java语言作为后端,在自己的网站如何接入易班的登录API(轻应用 ...

  3. 易班自动打卡+钉钉机器人消息提醒

    (一)声明 本文仅供学习交流使用,如有发热.感冒.咳嗽请及时根据当地疫情防控办法及时上报 (二)需求 首先,我双手支持和配合学校相关疫情防控政策. 其次,每天重复劳动让我们软件专业情何以堪.说干就干, ...

  4. delete可以传body吗_最简单的易班打卡脚本!可以自动打卡了

    易班web自动化打卡脚本 一直以来,易班打卡被称为最鸡肋,最浪费时间,最浪费纳税人钱财的表面工程,那么如何解决这一问题,已成为现在高校大学生的急需思考的大问题.那这一次我就来谈谈我是怎么解决这一问题的 ...

  5. php实现易班登录,简单的易班申请授权以及使用方式

    //以下三个变量内容需换成本应用的$APPID = ""; //在open.yiban.cn管理中心的AppID$APPSECRET = ""; //在open ...

  6. 一步一步教你开发微信扫码联合登录

    近日,公司要求在网站上实现微信联合登录功能,在网上搜索了好多都是调用接口或者是公众号授权登录方面的内容,现公司此功能已调试成功,在此将经验分享给大家: 第一步:注册微信开放平台账号,并进行认证,此认证 ...

  7. python自动点赞软件_python requests 简单实现易班登录,自动点赞,评论,发表

    小编能力有限,本文纯属瞎编,如有雷同,你去打辅导员涩 一.前戏 有个操蛋,操蛋,操蛋的辅导员促使小编成长,原因:易班需要活跃度,辅导员安排班上每个人必须去易班上 写文章,写评论,发投票...  我觉得 ...

  8. 易班php,易班轻应用开发:PHP版

    最近易班的APP接入了我们学校,虽然很多地区评价为毒瘤,流氓等等,应用市场评价也是最低级别.但是,作为开发者,就不管它了,本文写的是一个查询成绩的轻应用(传送门:青果教务查成绩),这里就只说说,如何接 ...

  9. 易班轻应用开发:PHP版

    最近易班的APP接入了我们学校,虽然很多地区评价为毒瘤,流氓等等,应用市场评价也是最低级别.但是,作为开发者,就不管它了,本文写的是一个查询成绩的轻应用(传送门:青果教务查成绩),这里就只说说,如何接 ...

  10. JavaScript + Thymeleaf + Spring Boot——易班优课YOOC课群在线测试自动答题解决方案(十八)模板脚本

    前文 JavaScript--易班优课YOOC课群在线测试自动答题解决方案(一)答案获取 Spring Boot--易班优课YOOC课群在线测试自动答题解决方案(二)答案储存 Spring Boot- ...

最新文章

  1. react-native新导航组件react-navigation详解
  2. php 错误传递,php-调用时通过引用传递错误,无法修复代码
  3. python 递归目录_Python3:递归实现输出目录下所有的文件
  4. Jupyter Notebook 访问密码重置
  5. C# WPF 显示图片和视频显示 EmuguCv、AForge.Net测试
  6. Linux命令【五】系统函数
  7. Objective-C浮点数转化整数(向上取整、向下取整)
  8. ios 给网页传值_iOS开发—页面传值汇总
  9. 计算机管理 窗口中找到 guest 用户,Guest 来宾用户不见了??
  10. python元组元素删除_Python3基础 tuple 通过拆分元素 把元组的数据删除
  11. EndNote导出任意期刊格式的参考文献
  12. php后门 佛像,给千年佛像做了个CT,结果好吓人
  13. 计算机大型机小型机的缩写,计算机可被划分为3个基本类型大型机,小型机与微型机。.doc...
  14. 创建android studio桌面图标
  15. git commit 提交出错,工作区代码被回退到最开始内容
  16. mapDispatchToProps
  17. (3分钟速通)Visual Odometry的特征点法和直接法
  18. 基于2.4GHz射频NRF24L01模块的智能家居项目总结
  19. JUnit和mockito
  20. Git的学习之路02 Git的工作流程、工作区、暂存区、版本库及创建版本库

热门文章

  1. C++利用Zip库解压缩文件
  2. Linux下显示IP地理位置信息的小工具—nali(很强大)
  3. office2016 excel复制粘贴就卡死
  4. 数据分析岗位求职经验分享
  5. 淘宝万能抢单exe,含python源码
  6. 用category重写NSMutableArray排序,倒序
  7. b站用户年龄段占比_用户和电商变现上,微博、小红书、B站差别在哪里?
  8. 2023年华东理工大学社会工作考研上岸前辈备考经验
  9. 卡特兰数(Catalan)
  10. java中implement_java中 implement和extends的作用和区别详细解释