用Django2.1开发易班联合登录
简书地址: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开发易班联合登录相关推荐
- 易班APP登录密码加密、sig逆向分析
1.最近闲来无事,听说有一个易班app登录好练手,就去试了一下看看. 先抓个包看看 然后使用了腾讯的壳,脱一下,我这边用的是BlackDex64. 脱完壳之后导出来直接导出来拖到jadx,就是现在这个 ...
- 如何使用java调用易班登录API获取个人账号信息(一)
关于这篇文章: 笔者近期和小伙伴接了校方的一个小小小项目,要求使用易班APP的账号,这意味着需要调用易班官方的登录API.下面介绍使用java语言作为后端,在自己的网站如何接入易班的登录API(轻应用 ...
- 易班自动打卡+钉钉机器人消息提醒
(一)声明 本文仅供学习交流使用,如有发热.感冒.咳嗽请及时根据当地疫情防控办法及时上报 (二)需求 首先,我双手支持和配合学校相关疫情防控政策. 其次,每天重复劳动让我们软件专业情何以堪.说干就干, ...
- delete可以传body吗_最简单的易班打卡脚本!可以自动打卡了
易班web自动化打卡脚本 一直以来,易班打卡被称为最鸡肋,最浪费时间,最浪费纳税人钱财的表面工程,那么如何解决这一问题,已成为现在高校大学生的急需思考的大问题.那这一次我就来谈谈我是怎么解决这一问题的 ...
- php实现易班登录,简单的易班申请授权以及使用方式
//以下三个变量内容需换成本应用的$APPID = ""; //在open.yiban.cn管理中心的AppID$APPSECRET = ""; //在open ...
- 一步一步教你开发微信扫码联合登录
近日,公司要求在网站上实现微信联合登录功能,在网上搜索了好多都是调用接口或者是公众号授权登录方面的内容,现公司此功能已调试成功,在此将经验分享给大家: 第一步:注册微信开放平台账号,并进行认证,此认证 ...
- python自动点赞软件_python requests 简单实现易班登录,自动点赞,评论,发表
小编能力有限,本文纯属瞎编,如有雷同,你去打辅导员涩 一.前戏 有个操蛋,操蛋,操蛋的辅导员促使小编成长,原因:易班需要活跃度,辅导员安排班上每个人必须去易班上 写文章,写评论,发投票... 我觉得 ...
- 易班php,易班轻应用开发:PHP版
最近易班的APP接入了我们学校,虽然很多地区评价为毒瘤,流氓等等,应用市场评价也是最低级别.但是,作为开发者,就不管它了,本文写的是一个查询成绩的轻应用(传送门:青果教务查成绩),这里就只说说,如何接 ...
- 易班轻应用开发:PHP版
最近易班的APP接入了我们学校,虽然很多地区评价为毒瘤,流氓等等,应用市场评价也是最低级别.但是,作为开发者,就不管它了,本文写的是一个查询成绩的轻应用(传送门:青果教务查成绩),这里就只说说,如何接 ...
- JavaScript + Thymeleaf + Spring Boot——易班优课YOOC课群在线测试自动答题解决方案(十八)模板脚本
前文 JavaScript--易班优课YOOC课群在线测试自动答题解决方案(一)答案获取 Spring Boot--易班优课YOOC课群在线测试自动答题解决方案(二)答案储存 Spring Boot- ...
最新文章
- react-native新导航组件react-navigation详解
- php 错误传递,php-调用时通过引用传递错误,无法修复代码
- python 递归目录_Python3:递归实现输出目录下所有的文件
- Jupyter Notebook 访问密码重置
- C# WPF 显示图片和视频显示 EmuguCv、AForge.Net测试
- Linux命令【五】系统函数
- Objective-C浮点数转化整数(向上取整、向下取整)
- ios 给网页传值_iOS开发—页面传值汇总
- 计算机管理 窗口中找到 guest 用户,Guest 来宾用户不见了??
- python元组元素删除_Python3基础 tuple 通过拆分元素 把元组的数据删除
- EndNote导出任意期刊格式的参考文献
- php后门 佛像,给千年佛像做了个CT,结果好吓人
- 计算机大型机小型机的缩写,计算机可被划分为3个基本类型大型机,小型机与微型机。.doc...
- 创建android studio桌面图标
- git commit 提交出错,工作区代码被回退到最开始内容
- mapDispatchToProps
- (3分钟速通)Visual Odometry的特征点法和直接法
- 基于2.4GHz射频NRF24L01模块的智能家居项目总结
- JUnit和mockito
- Git的学习之路02 Git的工作流程、工作区、暂存区、版本库及创建版本库