【发布时间】:2021-02-05 20:50:34
【问题描述】:
我有一个 react 应用程序,它允许用户通过管道输入特定的 Google Doc,然后我们分析其中的内容。对于第 1 步,选择文档,我使用的是 this nifty npm package,它还返回给我一个“OAuth 令牌”,我认为它是一个 access_token,我可以使用它来进行 API 调用。我将返回的令牌和 Picker API 返回的数据设置为我的组件中的状态变量,如下所示
<GooglePicker clientId={process.env.REACT_APP_GOOGLE_CLIENT_ID}
developerKey={process.env.REACT_APP_GOOGLE_API_KEY}
scope={SCOPES}
onAuthenticate={(token: any) => {
setGoogleToken(token)
}}
onChange={(data: any) => {
setGoogleData(data);
nextOnboardingStage();
}}
onAuthFailed={(data: any) => console.log('on auth failed:', data)}
multiselect={true}
navHidden={true}
authImmediate={false}
mimeTypes={['application/vnd.google-apps.document']}
viewId={'DOCS'}>
<MyCustomButton />
</GooglePicker>
然后我尝试调用Drive API export function在这个函数中下载所述文件
const downloadGoogleDoc = async (authToken: string, fileID: string) => {
const res = await axios.get(`https://www.googleapis.com/drive/v3/files/${fileID}/export`, {
headers: {
'Authorization': `token ${authToken}`
}
});
console.log(res);
};
但是,我在执行此操作时遇到 401 错误。有人能指出我在哪里失去了身份验证吗?非常感谢
编辑我的整个组件在下面
const SCOPES = ['https://www.googleapis.com/auth/drive.readonly'];
const Project: React.FC<ProjectInput> = () => {
const [googleToken, setGoogleToken] = useState<string>();
const [googleData, setGoogleData] = useState<any>({});
const [documentData, setDocumentData] = useState();
const downloadGoogleDoc = async (authToken: string, fileID: string) => {
try {
const res = await axios.get(`https://www.googleapis.com/drive/v3/files/${fileID}/export`, {
headers: {
'Authorization': `Bearer ${authToken}`
}
});
console.log(res);
} catch(e) {
console.log(e);
console.log(e.message);
}
};
console.log(googleToken);
console.log(googleData);
const MyCustomButton = () => {
return (
<button className="mx-8 my-2 p-2 rounded bg-blue-500 text-white">
Select From Google Drive
</button>
)
}
if (googleToken && googleData.docs) {
downloadGoogleDoc(googleToken, googleData.docs[0].id);
}
return (
<div className={`ml-${sideBarWidth}`}>
<FadeIn>
<div className="flex flex-col min-h-screen bg-gray-500 py-6 justify-center sm:py-12">
<div className="py-3 sm:max-w-xl sm:mx-auto">
<div className="bg-white min-w-1xl flex flex-col rounded-xl shadow-lg">
<div className="flex">
<div>
<div>
<div className="px-8 py-5">
<h2 className="text-gray-800 text-3xl font-semibold">Great! Select the document you'd like us to scan</h2>
</div>
</div>
<GooglePicker clientId={process.env.REACT_APP_GOOGLE_CLIENT_ID}
developerKey={process.env.REACT_APP_GOOGLE_API_KEY}
scope={SCOPES}
onAuthenticate={(token: any) => {
setGoogleToken(token)
}}
onChange={(data: any) => {
setGoogleData(data);
nextOnboardingStage();
}}
onAuthFailed={(data: any) => console.log('on auth failed:', data)}
multiselect={true}
navHidden={true}
authImmediate={false}
mimeTypes={['application/vnd.google-apps.document']}
viewId={'DOCS'}>
<MyCustomButton />
</GooglePicker>
</div>
</div>
</div>
</div>
</div>
</FadeIn>
</div>
);
};
export default Project;
编辑
正如@Tanaike 所说,我需要在我的请求中包含 MimeType,工作功能如下
const downloadGoogleDoc = async (authToken: string, fileID: string) => {
try {
const params = new URLSearchParams([['mimeType', 'text/html']]);
const res = await axios.get(`https://www.googleapis.com/drive/v3/files/${fileID}/export`, {
params,
headers: {
'Authorization': `Bearer ${authToken}`
}
});
console.log(res);
} catch(e) {
console.log(e);
console.log(e.message);
}
};
【问题讨论】:
-
您能否提供与您拨打
downloadGoogleDoc的位置相关的代码?
标签: reactjs google-drive-api authorization google-picker