Azure功能轻松身份验证和Google访问令牌

jaql4c8m  于 2022-12-14  发布在  Go
关注(0)|答案(1)|浏览(198)

我正在尝试将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。这也没有效果。

fhg3lkii

fhg3lkii1#

哇,这是一个糟糕的记录。在阅读了Azure Functions and App Service Authentication的博客文章后,似乎需要从函数应用本身检索“身份验证令牌”,而不是从谷歌检索“访问令牌”。在谷歌识别后,第一步中的id_token需要被POST转换为https://<functions_app>/.auth/login/google,并将以下内容作为正文:

{
  "id_token": "<id_token>"
}

这会依次返回如下内容:

{
  "authenticationToken": "<authenticationToken>",​
  "user": { "userId": "<sid>" }
}

然后,需要将此authenticationToken在标头中传递给每个函数调用,如下所示:

X-ZUMO-AUTH: <authenticationToken>

编辑:这似乎是充分记录,不知何故,我错过了这一点。

相关问题