時間:2023-07-31 23:24:01 | 來源:網(wǎng)站運營
時間:2023-07-31 23:24:01 來源:網(wǎng)站運營
網(wǎng)站添加第三方登錄(GitHub):Authorization callback URL
即回調(diào)地址,回調(diào)地址的作用是:當(dāng)你向GitHub發(fā)起相應(yīng)的請求后,GitHub返回對應(yīng)的數(shù)據(jù)的Url。應(yīng)用開通完成過后,GitHub會給你一些數(shù)據(jù),其中最重要的有:client_id
和client_secret
,這兩個參數(shù)是你在請求第三方登錄過程中需要用到的兩個必須參數(shù)。大致的請求過程如下:GET https://github.com/login/oauth/authorize
必須的參數(shù):client_id,請求返回的參數(shù):code。POST https://github.com/login/oauth/access_token
必須的參數(shù):client_id、client_secret、code,返回的參數(shù):access_token。GET https://api.github.com/user?access_token=...
必須的參數(shù):access_token,返回的參數(shù):用戶信息。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登錄標(biāo)記 user_github_node_id = 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.usernamedef 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() == '': # 普通用戶 print('ok') return self.username else: # 其他用戶 username = re.findall('([/s/S]*?)node_id', self.username) return username[0]User.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.# 繞過密碼驗證直接登錄用戶系統(tǒng)def login_direct(request, user): setattr(user, 'backend', 'django.contrib.auth.backends.ModelBackend') auth.login(request, user)# GitHub登錄的回調(diào)地址def GitHub_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'] if code == '': return HttpResponse('GitHub回調(diào)內(nèi)容錯誤,無法正常登錄') # 通過requests發(fā)起POST請求,得到對應(yīng)的access_token hea = { 'Accept': 'application/json' } data = { 'client_id': 'xxxxxxxxxxxx', 'client_secret': 'xxxxxxxxxxxxxxxxxxxxxxxxxxx', 'code': code, } response = requests.post('https://github.com/login/oauth/access_token', data=data, headers=hea) if ('error' in response.json().keys()): return HttpResponse('GitHub回調(diào)內(nèi)容錯誤,無法正常登錄') 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對應(yīng)的用戶是否存在 if not Profile.objects.filter(user_github_node_id=node_id).exists(): # 對應(yīng)的用戶不存在,則需要創(chuàng)建一個用戶,為了保證用戶的唯一性,用戶名使用username+node_id的方式創(chuàng)建 user = User(username=(user_info['login'] + 'node_id=' + node_id), password=node_id) user.save() # 創(chuàng)建對應(yīng)的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')
關(guān)鍵詞:
微信公眾號
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。