我正在尝试将Google身份验证添加到我的Azure Functions应用中,该应用将从Svelte静态Web应用(SWA)中使用。SWA使用Google身份(https://accounts.google.com/gsi/client)进行身份验证,然后检索access_token
。使用标准Google身份登录按钮执行身份验证。我也尝试过One Tap提示,结果相同。
google.accounts.id.initialize({
client_id: googleClientId,
callback: handleCredentialResponse,
});
google.accounts.id.renderButton(
button,
{ theme: 'outline', size: 'large' }, // customization attributes
);
用户通过身份验证,工作正常,我得到了一个JWT id_token
,其中包含姓名电子邮件图像等。这是一个有点烦人的用户,然后再次通过整个过程选择他们的帐户,但我想这是谷歌的经验。一旦我准备好做函数调用,然后继续授权:
function getAccessToken() {
return new Promise((resolve, reject) => {
const client = google.accounts.oauth2.initTokenClient({
client_id: googleClientId,
scope: "openid",
callback: (response) => {
if (response.access_token) {
resolve(access_token);
} else {
reject(response?.error);
}
},
});
client.requestAccessToken();
});
}
这也可以正常工作,我检索一个access_token
。然后我继续调用一个Azure函数,在头部使用这个令牌:
Authorization: Bearer <ACCESS_TOKEN>
这总是会导致401响应。我试过将所有函数设置为匿名,但没有效果。
我想知道这是否与作用域有关。在Google控制台中,只能添加Google特定的作用域,这就是为什么我为openid
作用域检索access_token
。
我还尝试将credentials
设置为include
,因为Easy Auth层可能希望从Web应用读取Cookie以验证用户。Azure Functions应用上的CORS已针对Web应用使用的主机名正确配置,并且在Function应用上启用了Access-Control-Allow-Credentials
。这也没有效果。
1条答案
按热度按时间fhg3lkii1#
哇,这是一个糟糕的记录。在阅读了Azure Functions and App Service Authentication的博客文章后,似乎需要从函数应用本身检索“身份验证令牌”,而不是从谷歌检索“访问令牌”。在谷歌识别后,第一步中的
id_token
需要被POST
转换为https://<functions_app>/.auth/login/google
,并将以下内容作为正文:这会依次返回如下内容:
然后,需要将此
authenticationToken
在标头中传递给每个函数调用,如下所示:编辑:这似乎是充分记录,不知何故,我错过了这一点。