阿语python4-2 美多商城v5.0用户登录-QQ登录之第4.2.4节OAuth2.0认证获取openid

OAuth2.0认证获取openid

待处理业务逻辑

# 提取code请求参数
# 使用code向QQ服务器请求access_token
# 使用access_token向QQ服务器请求openid
# 使用openid查询该QQ用户是否在美多商城中绑定过用户
# 如果openid已绑定美多商城用户,直接生成JWT token,并返回
# 如果openid没绑定美多商城用户,创建用户并绑定到openid

1. 获取QQ登录扫码页面

1.请求方式

选项方案
请求方法GET
请求地址/qq/login/

2.请求参数:查询参数

参数名类型是否必传说明
nextstring用于记录QQ登录成功后进入的网址

3.响应结果:JSON

字段说明
code状态码
errmsg错误信息
login_urlQQ登录扫码页面链接

4.后端逻辑实现

class QQAuthURLView(View):
    """提供QQ登录页面网址
    https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=xxx&redirect_uri=xxx&state=xxx
    """
    def get(self, request):
        # next表示从哪个页面进入到的登录页面,将来登录成功后,就自动回到那个页面
        next = request.GET.get('next')

        # 获取QQ登录页面网址
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID, client_secret=settings.QQ_CLIENT_SECRET, redirect_uri=settings.QQ_REDIRECT_URI, state=next)
        login_url = oauth.get_qq_url()

        return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'login_url':login_url})

5.QQ登录参数

QQ_CLIENT_ID = '101518219'
QQ_CLIENT_SECRET = '418d84ebdc7241efb79536886ae95224'
QQ_REDIRECT_URI = 'http://www.meiduo.site:8000/oauth_callback'

2. 接收Authorization Code

提示:

  • 用户在QQ登录成功后,QQ会将用户重定向到我们配置的回调网址。

  • 在QQ重定向到回调网址时,会传给我们一个Authorization Code

  • 我们需要拿到Authorization Code并完成OAuth2.0认证获取openid。

  • 在本项目中,我们申请QQ登录开发资质时配置的回调网址为:

    • http://www.meiduo.site:8000/oauth_callback

  • QQ互联重定向的完整网址为:

    • http://www.meiduo.site:8000/oauth_callback/?code=AE263F12675FA79185B54870D79730A7&state=%2F

class QQAuthUserView(View):
    """用户扫码登录的回调处理"""

    def get(self, request):
        """Oauth2.0认证"""
        # 接收Authorization Code
        code = request.GET.get('code')
        if not code:
            return http.HttpResponseForbidden('缺少code')
        pass
url(r'^oauth_callback/$', views.QQAuthUserView.as_view()),

3. OAuth2.0认证获取openid

  1. 使用code向QQ服务器请求access_token

  2. 使用access_token向QQ服务器请求openid

class QQAuthUserView(View):
    """用户扫码登录的回调处理"""

    def get(self, request):
        """Oauth2.0认证"""
        # 提取code请求参数
        code = request.GET.get('code')
        if not code:
            return http.HttpResponseForbidden('缺少code')

        # 创建工具对象
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID, client_secret=settings.QQ_CLIENT_SECRET, redirect_uri=settings.QQ_REDIRECT_URI)

        try:
            # 使用code向QQ服务器请求access_token
            access_token = oauth.get_access_token(code)

            # 使用access_token向QQ服务器请求openid
            openid = oauth.get_open_id(access_token)
        except Exception as e:
            logger.error(e)
            return http.HttpResponseServerError('OAuth2.0认证失败')
        pass

4. 本机绑定www.meiduo.site域名

1.ubuntu系统或者Mac系统

编辑 /etc/hosts

2.Windows系统

编辑 C:\Windows\System32\drivers\etc\hosts
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
基于 Django 的前后端分离可以使用 Django Rest Framework(DRF)来实现。DRF 是 Django 的一个扩展,提供了一整套用于构建 Web API 的工具和框架,可以让我们轻松地将 Django 应用程序转换为 Web API 服务。 下面是实现步骤: 1.安装 Django 和 DRF: ``` pip install django pip install djangorestframework ``` 2.创建一个 Django 项目和应用程序: ``` django-admin startproject myproject cd myproject python manage.py startapp myapp ``` 3.在应用程序的 models.py 中定义用户模型,并使用 Django 自带的用户认证系统(或自定义认证系统): ```python from django.contrib.auth.models import AbstractUser class User(AbstractUser): pass ``` 4.在应用程序的 serializers.py 中定义用户序列化器以便将用户模型转换为 JSON 格式: ```python from rest_framework import serializers from myapp.models import User class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ('id', 'username', 'email') ``` 5.在应用程序的 views.py 中定义用户视图,使用 DRF 提供的视图类来处理 HTTP 请求: ```python from rest_framework import generics from myapp.models import User from myapp.serializers import UserSerializer class UserList(generics.ListCreateAPIView): queryset = User.objects.all() serializer_class = UserSerializer class UserDetail(generics.RetrieveUpdateDestroyAPIView): queryset = User.objects.all() serializer_class = UserSerializer ``` 6.在应用程序的 urls.py 中定义用户 URL,指向用户视图: ```python from django.urls import path from myapp.views import UserList, UserDetail urlpatterns = [ path('users/', UserList.as_view()), path('users/<int:pk>/', UserDetail.as_view()), ] ``` 7.在前端页面中发送 HTTP 请求到后端 URL,获取用户数据: ```javascript // 使用 jQuery 或其他库发送 HTTP GET 请求 $.ajax({ url: '/api/users/', type: 'GET', dataType: 'json', success: function(data) { // 处理返回的用户数据 console.log(data); }, error: function(xhr, status, error) { // 处理错误 console.error(error); } }); ``` 8.在前端页面中使用 AJAX 技术将表单数据发送到后端 URL,进行用户登录: ```javascript // 使用 jQuery 或其他库发送 HTTP POST 请求 $.ajax({ url: '/api/login/', type: 'POST', dataType: 'json', data: { username: $('#username').val(), password: $('#password').val() }, success: function(data) { // 处理返回的用户数据 console.log(data); }, error: function(xhr, status, error) { // 处理错误 console.error(error); } }); ``` 以上就是基于 Django 的前后端分离实现用户登录的一般步骤。具体实现可能因项目需求而异,需要根据实际情况进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zz77244920

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值