Django REST to React - 获取没有密码的社交认证令牌

时间:2017-07-27 20:10:07

标签: django reactjs django-rest-framework django-rest-auth social-authentication

我想将信息传递给React,该信息是关于仅在后端使用社交身份验证的应用程序中的当前经过身份验证的用户(由social_django处理)。我的所有用户和用户令牌信息都存储在django REST中,为了访问令牌,我通常必须将POST请求发送到rest_framework.authtoken的obtain_auth_token视图。我的django root urls.py文件看起来像:

...
from rest_framework.authtoken.views import obtain_auth_token

urlpatterns = [
    ...
    url(r'^obtain-auth-token/$', obtain_auth_token),
    ...
]

但是,为了实际获取与我的数据库中的用户关联的auth令牌,我需要在POST请求中提供用户名和密码。社交身份验证会自动创建新用户而不分配任何密码,那么如何获取这些令牌?

1 个答案:

答案 0 :(得分:0)

你有这个工作吗?如果不是,这就是我所做的。希望它有所帮助。

我的设置

  1. 与Postgres的Django
  2. 用于REST API实现的Django Rest Framework
  3. 用于社交认证的Python社交认证(PSA)(目前正在使用Google+库)
  4. Reactjs frontend
  5. 使用<a href="{% url 'social:begin' 'google-plus' %}">Login</a>进行登录时,会转换为/login/google-plus/。这不仅可以获得acess_token,还可以创建一个社交用户&#34;在您的数据库中。我在我的案例中使用了oauth 2.0客户端库,并大致遵循this方法来获取具有客户端所有详细信息的google用户对象。我用ajax调用替换了上面链接中的表单,这更灵活,并控制我访问令牌和其他必要的信息。此处的ajax调用可确保在数据库中的社交auth表中创建社交用户。

    <script type="text/javascript">
    
    gapi.load('auth2', function () {
    let auth2;
    
    auth2 = gapi.auth2.init({
      client_id: "YOUR CLIENT ID",
      scope: "profile",
      cookie_policy: 'single_host_origin'
    });
    
    auth2.then(function () {
      let button = document.getElementById("google-plus-button");
    
      auth2.attachClickHandler(button, {}, function (googleUser) {
        // Send access-token to backend to finish the authenticate
        // with your application
    
        let authResponse = googleUser.getAuthResponse();
    
        $.ajax({
          "type": "POST",
          "url": "/complete/google-plus/",
          "data": {
            "access_token": authResponse.access_token,
            "CSRF": "{% csrf_token %}"
          }
        }).then(function(data){
          console.log(data);
          // Your success code
        }).fail(function(error){
          console.log(error);
        });
      });
     });
    });
    </script>
    

    获取access_tokens后,可以将它们存储在浏览器本地存储中,直到用户退出为止。注销时可以删除它们。

    这种方法适用于我提到的设置。此外,用户名和密码查询/obtain-auth-token的问题根本不存在。

    肯定有兴趣知道是否有其他方法可以从PSA django访问社交认证令牌。干杯!