Django REST to React - 在没有密码的情况下获取社交身份验证令牌



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

...
from rest_framework.authtoken.views import obtain_auth_token
urlpatterns = [
...
url(r'^obtain-auth-token/$', obtain_auth_token),
...
]

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

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

我的设置

  1. Django with Postgres
  2. Django Rest Framework for REST API 实现
  3. 用于社交身份验证的Python Social Auth (PSA((目前使用Google+库(
  4. Reactjs 前端

使用<a href="{% url 'social:begin' 'google-plus' %}">Login</a>登录时,它会转换为/login/google-plus/.这不仅可以获取acess_token,还可以在您的数据库中创建一个"社交用户"。在我的案例中,我使用了oauth 2.0客户端库,并大致遵循这种方法来获取Google用户对象以及客户端的所有详细信息。我用 ajax 调用替换了上面链接中的表单,它更灵活,并让我控制访问令牌和其他必要的信息。此处的 ajax 调用可确保在数据库内的社交身份验证表中创建社交用户。

<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 访问社交身份验证令牌。干杯!

相关内容

最新更新