在 django-rest-framework 中插入 django-allauth 作为端点
Posted
技术标签:
【中文标题】在 django-rest-framework 中插入 django-allauth 作为端点【英文标题】:Plug in django-allauth as endpoint in django-rest-framework 【发布时间】:2013-07-25 13:43:42 【问题描述】:我在我的网站上使用 django-allauth 进行社交登录。我还有一个由 django-rest-framework 提供支持的 REST API,用作移动应用程序的后端。有没有办法可以直接将 allauth 的身份验证后端插入 REST api,以便验证(和注册)在移动应用中使用 Facebook 登录的用户?
澄清一下:Facebook 登录部分由原生 SDK 处理。我需要一个类似POST /user
的端点(即创建一个新用户),但将 Facebook oauth 令牌作为输入而不是电子邮件/密码等。
【问题讨论】:
oauth2 token authentication using django-oauth-toolkit and python-social-auth 的可能重复项 【参考方案1】:你可以使用 Django Rest Auth 这取决于 django-allauth。它很容易集成。
【讨论】:
这是终极答案!谢谢 存储库未维护/废弃 2 年。 github.com/iMerica/dj-rest-auth 是现在用的【参考方案2】:您可以将此库用于社交身份验证django-rest-framework-social-oauth2。试试这个 django-allauth 相关代码
urls.py
urlpatterns = [
url(
r'^rest/facebook-login/$',
csrf_exempt(RestFacebookLogin.as_view()),
name='rest-facebook-login'
),
]
serializers.py
class EverybodyCanAuthentication(SessionAuthentication):
def authenticate(self, request):
return None
views.py
class RestFacebookLogin(APIView):
"""
Login or register a user based on an authentication token coming
from Facebook.
Returns user data including session id.
"""
# this is a public api!!!
permission_classes = (AllowAny,)
authentication_classes = (EverybodyCanAuthentication,)
def dispatch(self, *args, **kwargs):
return super(RestFacebookLogin, self).dispatch(*args, **kwargs)
def get(self, request, *args, **kwargs):
try:
original_request = request._request
auth_token = request.GET.get('auth_token', '')
# Find the token matching the passed Auth token
app = SocialApp.objects.get(provider='facebook')
fb_auth_token = SocialToken(app=app, token=auth_token)
# check token against facebook
login = fb_complete_login(original_request, app, fb_auth_token)
login.token = fb_auth_token
login.state = SocialLogin.state_from_request(original_request)
# add or update the user into users table
complete_social_login(original_request, login)
# Create or fetch the session id for this user
token, _ = Token.objects.get_or_create(user=original_request.user)
# if we get here we've succeeded
data =
'username': original_request.user.username,
'objectId': original_request.user.pk,
'firstName': original_request.user.first_name,
'lastName': original_request.user.last_name,
'sessionToken': token.key,
'email': original_request.user.email,
return Response(
status=200,
data=data
)
except:
return Response(status=401, data=
'detail': 'Bad Access Token',
)
【讨论】:
你可以给我一个指南,告诉我如何让它以与谷歌提供商相同的方式工作。??提前致谢。【参考方案3】:虽然我不太确定如何同时使用 allauth 和 rest-fremework,但 allauth does not offer such an endpoint。 建议:制作你自己的,做以下的变化: 调用 allauth.socialaccount.providers.facebook.views.fb_complete_login(None, socialtoken),其中 socialtoken 是在 login_by_token 中创建的。这会执行(更深入的一些功能)django.contrib.auth.login,可能会创建帐户。 之后,为了在移动设备上使用,可能可以获得 auth(不是 FB)令牌:获取用户数据(来自会话?),然后调用 rest_framework.authtoken.views.obtain_auth_token 备注: 1. 这无法解决电子邮件冲突或连接社交/本地帐户。 2. 我还没试过 - 如果你能让它工作,请发布代码。
【讨论】:
【参考方案4】:您可以使用 djoser,但我不知道它如何与 allauth 合作: https://github.com/sunscrapers/djoser
【讨论】:
以上是关于在 django-rest-framework 中插入 django-allauth 作为端点的主要内容,如果未能解决你的问题,请参考以下文章
django-rest-framework - 在可浏览的 API 中自动生成表单?
在带有 django-rest-framework 的过滤器中使用自定义方法
如何在 React 中显示来自 django-rest-framework 的错误消息