15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > 网站添加第三方登录(新浪微博)

网站添加第三方登录(新浪微博)

时间:2023-05-23 07:57:02 | 来源:网站运营

时间:2023-05-23 07:57:02 来源:网站运营

网站添加第三方登录(新浪微博):

概要:

昨天接入了GitHub的第三方登录,迫不及待想要接入QQ和新浪微博的第三方登录,由于QQ和微博的三方登录申请都还在审核中,无法进行登录申请,但是今天发现微博有一个添加测试用户的功能,也就是说可以在还没有通过审核的前提下进行三方登录的申请,但是只有测试用户才能登录成功,其他用户则不会返回数据,所以打算先把代码写上,测试就添加测试用户进行测试,当审核通过后就可以实现所有用户的微博登录。

OAuth2.0授权登录的过程:

1:引导需要授权的用户到验证地址,如果用户同意授权,页面跳转至你创建应用时填写的回调地址,并且会通过GET的方式返回一个code参数,这个参数后面会用到。

请求方式和URL:

GET/POST https://api.weibo.com/oauth2/authorize 请求需要的参数:


返回的数据:

示例:

//请求https://api.weibo.com/oauth2/authorize?client_id=123050457758183&redirect_uri=http://www.example.com/response&response_type=code//同意授权后会重定向http://www.example.com/response&code=CODE2:换取Access Token。

请求的方式及URL:

POST https://api.weibo.com/oauth2/access_token请求需要的参数:

返回的数据:

到这里就已经得到了能够查询到用户信息的两个重要参数:access_token和uid。

3:请求得到用户信息(用户名、用户头像等)

请求的方式及URL:

GET https://api.weibo.com/2/users/show.json请求需要的参数:

返回的部分数据:

如何将微博用户加入到自己的用户系统

将微博用户加入到自己的用户系统的方法与将GitHub用户加入到自己的用户系统的方式相同,可以参考添加第三方登录(GitHub)。
代码如下:

from django.db import modelsfrom django.contrib.auth.models import Userimport re# Create your models here.class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name='昵称') nickname = models.CharField(max_length=20) user_img_base64 = models.TextField(default='') # 用户GitHub登录标记 user_github_node_id = models.CharField(default='', max_length=100) # 用户微博登录标记 user_weibo_idstr = models.CharField(default='', max_length=100) def __str__(self): return '' % (self.nickname, self.user.username)def get_nickname(self): if Profile.objects.filter(user=self).exists(): profile = Profile.objects.get(user=self) return profile.nickname else: return ''def get_nickname_or_username(self): if Profile.objects.filter(user=self).exists(): profile = Profile.objects.get(user=self) return profile.nickname else: return self.username# 得到微博idstrdef get_user_weibo_idstr(self): if Profile.objects.filter(user=self).exists(): return Profile.objects.get(user=self).user_weibo_idstr else: return ''def has_nickname(self): return Profile.objects.filter(user=self).exists()def get_user_img_base64(self): if Profile.objects.filter(user=self).exists(): return Profile.objects.get(user=self).user_img_base64 else: return ''def get_user_github_node_id(self): if Profile.objects.filter(user=self).exists(): return Profile.objects.get(user=self).user_github_node_id else: return ''# 自定义得到username的方法def new_get_username(self): if (self.get_user_github_node_id() == '') and (self.get_user_weibo_idstr() == ''): # 普通用户 return self.username elif (self.get_user_github_node_id() != '') and (self.get_user_weibo_idstr() == ''): # GitHub用户 username = re.findall('([/s/S]*?)node_id', self.username) return username[0] elif (self.get_user_github_node_id() == '') and (self.get_user_weibo_idstr() != ''): # 微博用户 username = re.findall('([/s/S]*?)idstr', self.username) return username[0] else: return self.usernameUser.get_user_weibo_idstr = get_user_weibo_idstrUser.new_get_username = new_get_usernameUser.get_user_github_node_id = get_user_github_node_idUser.get_user_img_base64 = get_user_img_base64User.get_nickname = get_nicknameUser.has_nickname = has_nicknameUser.get_nickname_or_username = get_nickname_or_username

请求数据和完成登录

请求数据的方法前面已经提到了,只要按照对应的流程来请求数据,就能够得到用户的基本信息,得到信息过后创建对应的记录,最后就需要完成用户的登录,但是用户是第三方登录,所以就没有必要设置登录密码,只要能够得到对应的用户信息,就说明该用户在微博系统是存在的,所以这里需要用到setattr(user, 'backend', 'django.contrib.auth.backends.ModelBackend')来绕过密码验证直接登录。

from django.shortcuts import render# Create your views here.from django.shortcuts import render, HttpResponse, HttpResponseRedirectimport requestsfrom django.contrib.auth.models import Userfrom user.models import Profilefrom django.contrib import auth# Create your views here.# 绕过密码验证直接登录用户系统def login_direct(request, user): setattr(user, 'backend', 'django.contrib.auth.backends.ModelBackend') auth.login(request, user)# GitHub登录的回调地址def GitHub_Login(request): if request.method == "GET": context = {} context['message'] = 'GitHub回调内容错误,无法正常登录' code = request.GET.get('code', '') # 获得session中的来源页面 from_page = request.session.get('from_page', '/main/') # 清除session del request.session['from_page'] if code == '': return render(request, 'message.html', context) # 通过requests发起POST请求,得到对应的access_token hea = { 'Accept': 'application/json' } data = { 'client_id': 'xxxxxxxxxx', 'client_secret': 'xxxxxxxxxxxxxxxxxxxx', 'code': code, } response = requests.post('https://github.com/login/oauth/access_token', data=data, headers=hea) if ('error' in response.json().keys()): return render(request, 'message.html', context) access_token = response.json()['access_token'] url = 'https://api.github.com/user?access_token=' + access_token user_info = requests.get(url).json() # 得到node_id node_id = user_info['node_id'] # 判断node_id对应的用户是否存在 if not Profile.objects.filter(user_github_node_id=node_id).exists(): # 对应的用户不存在,则需要创建一个用户,为了保证用户的唯一性,用户名使用username+node_id的方式创建 user = User(username=(user_info['login'] + 'node_id=' + node_id), password=node_id) user.save() # 创建对应的node_id记录 add_node_id = Profile(user=user, user_github_node_id=node_id, user_img_base64=user_info['avatar_url']) add_node_id.save() else: user = Profile.objects.get(user_github_node_id=node_id) user.user_img_base64 = user_info['avatar_url'] user.save() user = User.objects.get(username=(user_info['login'] + 'node_id=' + node_id)) login_direct(request, user) return HttpResponseRedirect(from_page) else: return HttpResponse('is not GET request')# 微博登录的回调地址def WeiBo_Login(request): if request.method == 'GET': code = request.GET.get('code', '') # 获得session中的来源页面 from_page = request.session.get('from_page', '/main/') # 清除session del request.session['from_page'] context = {} context['message'] = '回调信息出现错误,请重新登录' if code == '': return render(request, 'message.html', context) # 通过POST请求获得access_token数据 get_access_token_data = { 'client_id': 'xxxxxxxxxxxxxxxx', 'client_secret': 'xxxxxxxxxxxxxxxxxxxxxxxxx', 'grant_type': 'authorization_code', 'code': code, 'redirect_uri': 'http://106.14.185.220:8000/Weibo_Login/', } response = requests.post('https://api.weibo.com/oauth2/access_token', data=get_access_token_data) # 获得返回回来的json数据的所有key值 keys = response.json().keys() # 判断access_token是否有返回回来,如果没有返回access_token则说明请求发生错误 if not ('access_token' in keys): return render(request, 'message.html', context) # 请求成功,得到了access_token # 通过GET请求获得用户信息 uid = response.json()['uid'] access_token = response.json()['access_token'] url = 'https://api.weibo.com/2/users/show.json?uid=' + uid + '&access_token=' + access_token response = requests.get(url=url) # 获得返回的json数据的所有key值 keys = response.json().keys() # 判断是否返回screen_name和idstr if not ('screen_name' in keys and 'idstr' in keys and (response.json()['idstr'] != '')): return render(requset, 'message.html', context) # 得到对应的数据 screen_name = response.json()['screen_name'] # 得到用户id(字符串) idstr = response.json()['idstr'] # 得到用户头像 user_img = response.json()['profile_image_url'] username = screen_name + 'idstr' + idstr # 通过idstr查询数据库中是否存在对应的登录记录 if not Profile.objects.filter(user_weibo_idstr=idstr).exists(): # 不存在对应的记录,需要创建对应的记录 # 创建用户 weibo_user = User(username=username, password=idstr) weibo_user.save() # 创建对应的登录记录 weibo_login = Profile(user=weibo_user, user_img_base64=user_img, user_weibo_idstr=idstr) weibo_login.save() # 得到用户 # 用户修改用户名过后及时更改用户信息 if not User.objects.filter(username=username).exists(): update_user = Profile.objects.get(user_weibo_idstr=idstr).use update_user.username = username update_user.save() user = User.objects.get(username=username) # 绕过密码验证直接登录 login_direct(request, user) return HttpResponseRedirect(from_page) else: context = {} context['message'] = 'is not GET request' return render(request, 'message.html', context)

最终效果

1:登录入口


2:登录界面

3:登录结果

原文地址、我的网站。

关键词:

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭