我正在尝试创建一个连接到Google Calendar API的Web服务。在尝试授权我的应用时,我生成了一个包含必要范围的网址。问题是当我尝试将客户端重定向到生成的URL时,我收到405错误,并显示以下消息:
对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许来源“http://localhost:8080” 访问。响应的HTTP状态代码为405。
在大多数情况下,我一直在使用node.js客户端库来遵循本指南:https://developers.google.com/identity/protocols/OAuth2WebServer。
根据我的理解,Google似乎没有将他们的服务器配置为接受跨源请求,我不明白如果我无法向我的用户发送请求,我应该如何将用户重定向到他们的授权页面域。
以下是相关代码:
export function authorize(req, res, callback): any {
let auth = new googleAuth();
let oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl);
if (// Check if we have previously stored a token.) {
oauth2Client.credentials = //get token;
callback(oauth2Client);
} else {
//redirect to google authentication page
let authUrl = oauth2Client.generateAuthUrl({
access_type: 'offline',
state: '/',
scope: SCOPES
});
res.redirect(authUrl);
}
}
答案 0 :(得分:0)
如果有人使用React或类似的SPA框架解决与OAuth 2相关的问题,请阅读以下内容:
请勿在服务器端重定向。不要这样做(node.js / express作为后端示例):
router.get('/go', errorHandler(async (req, res, next) => {
res.redirect(authenticationUrl);
})
);
这样做:
router.get('/go', errorHandler(async (req, res, next) => {
res.json({
redirectUrl: 'https://google.com'
})
})
);
然后在您的前端客户端上,获取响应并进行重定向。示例:
getUrl = async () => {
try {
const res = await API.get(`/go`);
window.location = res.data.redirectUrl;
} catch (err) {
console.log(err);
}
}
在React中工作。已检查!
答案 1 :(得分:0)
根据流程,它显示为浏览器(APP)-> API(服务器)-> Google auth(重定向),这是身份提供商服务器(如 AWS、Google Auth 等)非常常见的路径。如他们从不发送额外的 ALLOW ORIGIN 标头,这就是浏览器在重定向时拒绝请求的原因
现在是锻炼解决方案。
应用域 (http://localhost:3000) 应添加为 IDP 服务器上的受信任域
向 API 服务器发起 Auth 请求的请求应为
window.location.href = 'http://localhost:5000/api/v1/auth/login-google';