2

我成功地使用 curl 请求通过 Django-social-auth 使用 Facebook 令牌对我的 Django 项目中的用户进行身份验证,以返回我个人网站的令牌。很简单,我有一个 Facebook 令牌,我将其转换为 Django 令牌作为回报,但我只是使用 CURL 请求来完成这一壮举。我使用的框架来自 Philip Garnero (1)。

CURL 请求 - curl -X POST -d "grant_type=convert_token&client_id=&client_secret=&backend=facebook&token=" http://localhost:8000/auth/convert-token

当我尝试使用 AJAX 请求执行此操作时,就会出现混乱。我的ajax设置方式有问题吗?在将我的 facebook 令牌转换为经过身份验证的 Django 令牌之前,我是否需要先获取一个 csrf 令牌?

更新:通过代理运行我的 ajax 请求时,我收到 400 错误 unsupported_grant_type。该请求与我在 curl 命令和 Postman 命令中成功执行的请求相同。

阿贾克斯请求:

$http({
        url: "proxy/url/...",
        async: false,
        crossDomain: true,  
        method: "POST",
        data: {
          "client_id": "...",
          "client_secret": "...",
          "grant_type": "password",
          "username": "...",
          "password": "..."
        },
        headers: {
              'Content-Type': 'application/x-www-form-urlencoded'
        }        
        }).success(function(data, status, headers, config) {
            console.log(data);
        }).error(function(data, status, headers, config) {
            console.log("error status = " + status);
            console.log(angular.toJson(data));
        });

(1) - https://github.com/PhilipGarnero/django-rest-framework-social-oauth2

4

1 回答 1

2

我发现了这个问题,但我不能指出我为了让它工作而做的具体事情。相反,我会写下我为获得一个工作系统所做的一切。我的特定示例是使用 facebook 身份验证并将令牌转换为我用来跟踪用户的 django csrf 令牌的离子应用程序。

我的设置:Django、Django rest-framework Social Oauth2(Philip Garnero 的设置)、Django social auth、angular js、cordova facebook 插件、ionic(充当前端的第 3 方应用程序),最后是配置的代理服务。

步骤:第一,确保安装了rest api系统。我使用了 Philip Garnero 的 api (1)。一旦我从 Garnero 获得了可安装的软件包,我就必须配置一个 ionic 代理服务。我使用 Ionic 的教程来完成它 (2)。该文档值得阅读以了解跨域请求的要点。最后,如果没有测试和研究,我找不到附加到 ajax 请求的正确标头。我最终使用了一个非常有用的工具 Postman 来解决它。这是一个“令人困惑的困难”请求的愚蠢示例:

$http.post(Url, queryStringData,
        {headers: {
              'Accept': '*/*',
              "cache-control": "no-cache",
              'Content-Type': 'application/x-www-form-urlencoded'
        }        
        }).success(function(data, status, headers, config) {
            console.log(data.access_token);
        }).error(function(data, status, headers, config) {
            console.log("error status = " + status);
            console.log(angular.toJson(data));
        });

如果您有任何问题,请发表评论。我会尽我所能清理原始帖子,如果其他人有同样的问题,我可能会考虑一个教程。我花了 5 个小时试图破解这个。

(1)- https://github.com/PhilipGarnero/django-rest-framework-social-oauth2 (2)- http://blog.ionic.io/handling-cors-issues-in-ionic/

于 2016-01-04T00:11:07.313 回答