Tôi có API REST và tôi cần xác thực người dùng thông qua API đăng nhập Facebook. Mã truy cập sẽ được lấy trong ứng dụng di động (tôi đoán) và sau đó được gửi đến máy chủ. Vì vậy, tôi đã tìm thấy một số mã trong hướng dẫn cũ và tôi không thể làm cho nó hoạt động. Dưới đây là các mã:Cách xác thực bằng Mã truy cập bằng mã python-social-auth
from social.apps.django_app.utils import strategy
from django.contrib.auth import login
from django.views.decorators.csrf import csrf_exempt
from rest_framework.decorators import api_view, permission_classes
from rest_framework import permissions, status
from django.http import HttpResponse as Response
@strategy()
def auth_by_token(request, backend):
user=request.user
user = backend.do_auth(
access_token=request.DATA.get('access_token'),
user=user.is_authenticated() and user or None
)
if user and user.is_active:
return user
else:
return None
@csrf_exempt
@api_view(['POST'])
@permission_classes((permissions.AllowAny,))
def social_register(request):
auth_token = request.DATA.get('access_token', None)
backend = request.DATA.get('backend', None)
if auth_token and backend:
try:
user = auth_by_token(request, backend)
except Exception, err:
return Response(str(err), status=400)
if user:
login(request, user)
return Response("User logged in", status=status.HTTP_200_OK)
else:
return Response("Bad Credentials", status=403)
else:
return Response("Bad request", status=400)
Khi tôi cố gắng để gửi yêu cầu với thông số POST, tôi nhận được lỗi này:
'unicode' object has no attribute 'do_auth'
tôi tìm thấy một ví dụ trong official documentation, nó sử dụng @psa('social:complete')
trang trí:
from django.contrib.auth import login
from social.apps.django_app.utils import psa
# Define an URL entry to point to this view, call it passing the
# access_token parameter like ?access_token=<token>. The URL entry must
# contain the backend, like this:
#
# url(r'^register-by-token/(?P<backend>[^/]+)/$',
# 'register_by_access_token')
@psa('social:complete')
def register_by_access_token(request, backend):
# This view expects an access_token GET parameter, if it's needed,
# request.backend and request.strategy will be loaded with the current
# backend and strategy.
token = request.GET.get('access_token')
user = backend.do_auth(request.GET.get('access_token'))
if user:
login(request, user)
return 'OK'
else:
return 'ERROR'
Nhưng nếu tôi cần chuyển tên phụ trợ trong phần nội dung yêu cầu thì sao?
Nó phải là '' request.backend.do_auth (request.GET.get ('access_token')) '', tôi đã cập nhật các tài liệu với đoạn mã đúng. – omab
Bạn có thể đăng nó làm câu trả lời không? –