.html', #lrj: URL路径模式,包含整数类型的oauthid参数
+ views.bindsuccess, # lrj:对应的视图函数
+ name='bindsuccess'), # lrj:URL名称,用于反向解析
- # OAuth登录入口URL
- # 路径:/oauth/oauthlogin
- # 重定向用户到第三方平台的授权页面
+ # lrj:OAuth登录入口URL
+ #lrj: 路径:/oauth/oauthlogin
+ #lrj: 重定向用户到第三方平台的授权页面
path(
- r'oauth/oauthlogin', # URL路径模式
- views.oauthlogin, # 对应的视图函数
- name='oauthlogin') # URL名称,用于反向解析
+ r'oauth/oauthlogin', # lrj:URL路径模式
+ views.oauthlogin, #lrj: 对应的视图函数
+ name='oauthlogin') # lrj:URL名称,用于反向解析
]
diff --git a/src/DjangoBlog/oauth/views.py b/src/DjangoBlog/oauth/views.py
index 32a8769..d661cd7 100644
--- a/src/DjangoBlog/oauth/views.py
+++ b/src/DjangoBlog/oauth/views.py
@@ -1,4 +1,4 @@
-"""
+"""lrj:
OAuth 认证视图模块
处理第三方登录的完整流程:授权、回调、用户绑定、邮件验证等
"""
@@ -24,12 +24,12 @@ from oauth.forms import RequireEmailForm
from .models import OAuthUser
from .oauthmanager import OAuthAccessTokenException, get_manager_by_type
-# 配置日志记录器
+# lrj:配置日志记录器
logger = logging.getLogger(__name__)
def get_redirecturl(request):
- """
+ """lrj:
获取安全的重定向URL,防止开放重定向漏洞
Args:
@@ -40,12 +40,12 @@ def get_redirecturl(request):
"""
nexturl = request.GET.get('next_url', None)
- # 处理特殊路径,避免登录循环
+ # lrj:处理特殊路径,避免登录循环
if not nexturl or nexturl == '/login/' or nexturl == '/login':
nexturl = '/'
return nexturl
- # 解析URL并验证域名安全性
+ # lrj:解析URL并验证域名安全性
p = urlparse(nexturl)
if p.netloc:
site = get_current_site().domain
@@ -57,7 +57,7 @@ def get_redirecturl(request):
def oauthlogin(request):
- """
+ """lrj:
OAuth登录入口视图
重定向用户到第三方平台的授权页面
@@ -71,19 +71,19 @@ def oauthlogin(request):
if not type:
return HttpResponseRedirect('/')
- # 根据平台类型获取对应的OAuth管理器
+ # lrj:根据平台类型获取对应的OAuth管理器
manager = get_manager_by_type(type)
if not manager:
return HttpResponseRedirect('/')
- # 获取安全的重定向URL并生成授权页面URL
+ #lrj: 获取安全的重定向URL并生成授权页面URL
nexturl = get_redirecturl(request)
authorizeurl = manager.get_authorization_url(nexturl)
return HttpResponseRedirect(authorizeurl)
def authorize(request):
- """
+ """lrj:
OAuth授权回调处理视图
处理第三方平台回调,完成用户认证和账号绑定
@@ -101,10 +101,10 @@ def authorize(request):
if not manager:
return HttpResponseRedirect('/')
- # 获取授权码
+ # lrj:获取授权码
code = request.GET.get('code', None)
try:
- # 使用授权码获取访问令牌
+ # lrj:使用授权码获取访问令牌
rsp = manager.get_access_token_by_code(code)
except OAuthAccessTokenException as e:
logger.warning("OAuthAccessTokenException:" + str(e))
@@ -115,34 +115,34 @@ def authorize(request):
nexturl = get_redirecturl(request)
if not rsp:
- # 获取令牌失败,重新跳转到授权页面
+ # lrj:获取令牌失败,重新跳转到授权页面
return HttpResponseRedirect(manager.get_authorization_url(nexturl))
- # 获取用户信息
+ #lrj: 获取用户信息
user = manager.get_oauth_userinfo()
if user:
- # 处理空昵称情况
+ # lrj:处理空昵称情况
if not user.nickname or not user.nickname.strip():
user.nickname = "djangoblog" + timezone.now().strftime('%y%m%d%I%M%S')
try:
- # 检查是否已存在该OAuth用户
+ # lrj:检查是否已存在该OAuth用户
temp = OAuthUser.objects.get(type=type, openid=user.openid)
- # 更新用户信息
+ #lrj: 更新用户信息
temp.picture = user.picture
temp.metadata = user.metadata
temp.nickname = user.nickname
user = temp
except ObjectDoesNotExist:
- pass # 新用户,继续处理
+ pass # lrj:新用户,继续处理
- # Facebook的token过长,特殊处理
+ #lrj: Facebook的token过长,特殊处理
if type == 'facebook':
user.token = ''
- # 如果用户有邮箱,直接完成绑定和登录
+ # lrj:如果用户有邮箱,直接完成绑定和登录
if user.email:
- with transaction.atomic(): # 使用事务保证数据一致性
+ with transaction.atomic(): # lrj:使用事务保证数据一致性
author = None
try:
author = get_user_model().objects.get(id=user.author_id)
@@ -150,34 +150,34 @@ def authorize(request):
pass
if not author:
- # 创建或获取用户账号
+ # lrj:创建或获取用户账号
result = get_user_model().objects.get_or_create(email=user.email)
author = result[0]
- if result[1]: # 是新创建的用户
+ if result[1]: # lrj:是新创建的用户
try:
- # 检查用户名是否已存在
+ #lrj: 检查用户名是否已存在
get_user_model().objects.get(username=user.nickname)
except ObjectDoesNotExist:
author.username = user.nickname
else:
- # 用户名冲突,生成唯一用户名
+ # lrj:用户名冲突,生成唯一用户名
author.username = "djangoblog" + timezone.now().strftime('%y%m%d%I%M%S')
author.source = 'authorize'
author.save()
- # 关联OAuth用户和本站用户
+ # lrj:关联OAuth用户和本站用户
user.author = author
user.save()
- # 发送登录信号
+ # lrj:发送登录信号
oauth_user_login_signal.send(
sender=authorize.__class__, id=user.id)
- # 登录用户
+ # lrj:登录用户
login(request, author)
return HttpResponseRedirect(nexturl)
else:
- # 没有邮箱,需要用户补充邮箱信息
+ #lrj: 没有邮箱,需要用户补充邮箱信息
user.save()
url = reverse('oauth:require_email', kwargs={
'oauthid': user.id
@@ -188,7 +188,7 @@ def authorize(request):
def emailconfirm(request, id, sign):
- """
+ """lrj:
邮箱确认视图
通过邮件链接完成邮箱绑定和用户登录
@@ -203,7 +203,7 @@ def emailconfirm(request, id, sign):
if not sign:
return HttpResponseForbidden()
- # 验证签名安全性
+ #lrj: 验证签名安全性
if not get_sha256(settings.SECRET_KEY +
str(id) +
settings.SECRET_KEY).upper() == sign.upper():
@@ -214,7 +214,7 @@ def emailconfirm(request, id, sign):
if oauthuser.author:
author = get_user_model().objects.get(pk=oauthuser.author_id)
else:
- # 创建新用户账号
+ # lrj:创建新用户账号
result = get_user_model().objects.get_or_create(email=oauthuser.email)
author = result[0]
if result[1]:
@@ -223,19 +223,19 @@ def emailconfirm(request, id, sign):
) else "djangoblog" + timezone.now().strftime('%y%m%d%I%M%S')
author.save()
- # 完成绑定
+ # lrj:完成绑定
oauthuser.author = author
oauthuser.save()
- # 发送登录信号
+ # lrj:发送登录信号
oauth_user_login_signal.send(
sender=emailconfirm.__class__,
id=oauthuser.id)
- # 登录用户
+ # lrj:登录用户
login(request, author)
- # 发送绑定成功邮件
+ #lrj: 发送绑定成功邮件
site = 'http://' + get_current_site().domain
content = _('''
Congratulations, you have successfully bound your email address. You can use
@@ -259,7 +259,7 @@ def emailconfirm(request, id, sign):
class RequireEmailView(FormView):
- """
+ """lrj:
要求邮箱表单视图
处理用户补充邮箱信息的流程
"""
@@ -267,19 +267,19 @@ class RequireEmailView(FormView):
template_name = 'oauth/require_email.html'
def get(self, request, *args, **kwargs):
- """GET请求处理"""
+ """lrj:GET请求处理"""
oauthid = self.kwargs['oauthid']
oauthuser = get_object_or_404(OAuthUser, pk=oauthid)
- # 如果已有邮箱,可能直接跳转(当前注释掉了)
+ # lrj:如果已有邮箱,可能直接跳转(当前注释掉了)
if oauthuser.email:
pass
- # return HttpResponseRedirect('/')
+ # lrj:return HttpResponseRedirect('/')
return super(RequireEmailView, self).get(request, *args, **kwargs)
def get_initial(self):
- """设置表单初始值"""
+ """lrj:设置表单初始值"""
oauthid = self.kwargs['oauthid']
return {
'email': '',
@@ -287,7 +287,7 @@ class RequireEmailView(FormView):
}
def get_context_data(self, **kwargs):
- """添加上下文数据"""
+ """lrj:添加上下文数据"""
oauthid = self.kwargs['oauthid']
oauthuser = get_object_or_404(OAuthUser, pk=oauthid)
if oauthuser.picture:
@@ -295,18 +295,18 @@ class RequireEmailView(FormView):
return super(RequireEmailView, self).get_context_data(**kwargs)
def form_valid(self, form):
- """表单验证通过后的处理"""
+ """lrj:表单验证通过后的处理"""
email = form.cleaned_data['email']
oauthid = form.cleaned_data['oauthid']
oauthuser = get_object_or_404(OAuthUser, pk=oauthid)
oauthuser.email = email
oauthuser.save()
- # 生成安全签名
+ # lrj:生成安全签名
sign = get_sha256(settings.SECRET_KEY +
str(oauthuser.id) + settings.SECRET_KEY)
- # 构建确认链接
+ # lrj:构建确认链接
site = get_current_site().domain
if settings.DEBUG:
site = '127.0.0.1:8000'
@@ -316,7 +316,7 @@ class RequireEmailView(FormView):
})
url = "http://{site}{path}".format(site=site, path=path)
- # 发送确认邮件
+ # lrj:发送确认邮件
content = _("""
Please click the link below to bind your email
@@ -330,7 +330,7 @@ class RequireEmailView(FormView):
""") % {'url': url}
send_email(emailto=[email, ], title=_('Bind your email'), content=content)
- # 跳转到绑定成功提示页面
+ # lrj:跳转到绑定成功提示页面
url = reverse('oauth:bindsuccess', kwargs={
'oauthid': oauthid
})
@@ -339,7 +339,7 @@ class RequireEmailView(FormView):
def bindsuccess(request, oauthid):
- """
+ """lrj:
绑定成功提示页面
Args:
@@ -352,7 +352,7 @@ def bindsuccess(request, oauthid):
type = request.GET.get('type', None)
oauthuser = get_object_or_404(OAuthUser, pk=oauthid)
- # 根据绑定类型显示不同内容
+ #lrj: 根据绑定类型显示不同内容
if type == 'email':
title = _('Bind your email')
content = _(