尝试将文件上传到Google云端硬盘时,请继续收到“登录所需”错误 [英] Keep receiving Login Required error when trying to upload a file to Google Drive

查看:171
本文介绍了尝试将文件上传到Google云端硬盘时,请继续收到“登录所需”错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个Chrome扩展程序,它会截取某些下载内容(目前是.doc和.docx文件),而是将这些文件自动上传到您的Google驱动程序文件夹中。这是我的清单:

I am writing a chrome extension that will intercept certain downloads (currently .doc and .docx files) and instead take those files and automatically upload them to your Google driver folder. Here is my manifest:

{
    // Default manifest crap.
    "manifest_version": 2,
    "name": "App",
    "description": "SpartaHack 2016 application",
    "version": "1.0",
    "browser_action": {
        "default_icon": "icon.png",
        "default_popup": "popup.html"
    },
    // Content security needed to access gapi script.
    "content_security_policy": "script-src 'self' https://apis.google.com; object-src 'self'",
    // Need to view downloads, and identity for obvious reasons.
    // The other two permissions allow the script to access files that are outside our domain. 
    "permissions": [
        "downloads",
        "identity",
        "http://*/",
        "https://*/"
    ],
    // Gives us the auth information.
    "oauth2": {
        "client_id": "id",
        "scopes": [
            "https://www.googleapis.com/auth/drive.file",
            "https://www.googleapis.com/auth/userinfo.profile"
        ]
    },
    // Scripts that are always running.
    // Client.js has the gapi script, eventPage is our code.
    "background": {
        "scripts": ["client.js", "eventPage.js"]
    }
}

如果需要,我还编写了以下预先授权的方法:

I have also written the following method that preforms authorization, if needed:

chrome.identity.getAuthToken({
    "interactive": true
}, sendAuthToken);

function sendAuthToken(token) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token=' + token, true);
    xhr.onload = function() {
        console.log(xhr.response);
    }

    //TODO: 
    xhr.send();
    console.log(token);
    watchDownloads();
}

我从某个地方的例子中找到了这个片段。似乎仅仅预先形成授权是不够的,但我必须使用此令牌发送对用户信息的请求。这部分没有给我任何麻烦 - 令牌记录正常,记录的响应显示我所有的信息。

This snippet I found from an example somewhere. It seemed it wasn't enough to just preform authorization, but that I had to send a request for the user's information using this token as well. This part doesn't give me any trouble - the token is logged fine, and the response that is logged shows all of my information as expected.

这是watchDownloads( )看起来像:

Here is what watchDownloads() looks like:

function watchDownloads() {
    chrome.downloads.onCreated.addListener(function(download) {
        if(download.url.endsWith(".doc") || download.url.endsWith(".docx")) {
            // Get blob from URL
            var xhr = new XMLHttpRequest();
            xhr.open("GET", download.url, true);
            xhr.responseType = "blob";

            xhr.onload = function(error) {
                if(this.status == 200) {
                    insertFile(this.response, function(resp) {
                        console.log(resp);
                    });
                }
            };

            xhr.send();
        }
    });
}

简而言之,它会查找我关注的两个文件扩展名,以及如果它看到它们,那么它应该使用另一个HTTP请求直接获取该文件到文件的URL,然后使用这种方法将它上传到我们的驱动器中,这种方法主要是从在线样本拼凑而成:

In short, it looks for the two file extensions I am concerned with, and if it sees them it should then get that file using another HTTP request directly to the file's url, and then upload it into drive for us using this method, which has been mostly pieced together from online samples:

function insertFile(fileData, callback) {
    const boundary = "-------314159265358979323846";
    const delimiter = "\r\n--" + boundary + "\r\n";
    const close_delimiter = "\r\n--" + boundary + "--";

    //TODO: Remove
    console.log(fileData);

    var reader = new FileReader();
    reader.readAsBinaryString(fileData);
    reader.onload = function(error) {
        var contentType = fileData.type || "application/octet-stream";
        var metadata = {
            // "title": fileData.filename,
            "title": "Potato",
            "mimeType": contentType
        };

        var base64Data = btoa(reader.result);
        var multipartRequestBody =
            delimiter +
            "Content-Type: application/json\r\n\r\n" +
            JSON.stringify(metadata) +
            delimiter +
            "Content-Type: " + contentType + "\r\n" +
            "Content-Transfer-Encoding: base64\r\n\r\n" +
            base64Data +
            close_delimiter;

        //TODO: Remove
        console.log(multipartRequestBody);

        var request = gapi.client.request({
            "path": "/upload/drive/v3/files",
            "method": "POST",
            "params": {
                "key": "key",
                "uploadType": "multipart"
            },
            "headers": {
                "Content-Type": 'multipart/mixed; boundary="' + boundary + '"'
            },
            "body": multipartRequestBody
        });

        //TODO: Remove
        console.log(request);

        if(!callback) {
            callback = function(file) {
                console.log(file)
            };
        }

        request.execute(callback);
    }
}

这是失败的地方。我似乎无法使其工作,因为每次都会出现以下错误:

This is where it fails. I can't seem to get this to work, as the following error appears each time:

在这里正确登录我需要做什么?我已尝试在标头中添加授权属性,但得到相同的错误。

What do I have to do to have the proper login here? I have tried adding an Authorization property in the header, but get the same error.

推荐答案

这可能有助于其他人绊倒这个问题。

如果你确认使用JWT,请确保包含 auth:< your jwtClient> 在您的API通话中,例如:

This might help others stumbling upon this question.
If you did authorise using JWT, make sure to include auth: <your jwtClient> in your API call, like:

首先,获取令牌:

// Configure JWT auth client
var privatekey = require("./<secret>.json")
var jwtClient = new google.auth.JWT(
  privatekey.client_email,
  null,
  privatekey.private_key,
  ['https://www.googleapis.com/auth/drive']
);

// Authenticate request
jwtClient.authorize(function (err, tokens) {
  if (err) {
    return;
  } else {
    console.log("Google autorization complete");
  }
});

然后,调用API (但不要忘记 auth:jwtClient part)

Then, call the API (but don't forget the auth:jwtClient part)

drive.files.create({
    auth: jwtClient,
    resource: {<fileMetadata>},
    fields: 'id'
  }, function (err, file) {
    if (err) {
      // Handle error
    } else {
      // Success is much harder to handle
    }
});

这篇关于尝试将文件上传到Google云端硬盘时,请继续收到“登录所需”错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆