gpt4 book ai didi

google-cloud-platform - 如何在从谷歌工作区登录获得的 JWT/idToken 中添加自定义声明

转载 作者:行者123 更新时间:2023-12-05 03:21:40 24 4
gpt4 key购买 nike

我有一个简单的“使用 Google 登录”应用程序,只有 google workspace 的内部用户才能登录。例如

<html>
<body>
<script src="https://accounts.google.com/gsi/client" async defer></script>
<div id="g_id_onload"
data-client_id="CLIENT_ID"
data-context="signin"
data-ux_mode="popup"
data-callback="handleCredentialResponse">
</div>

<div class="g_id_signin"
data-type="standard"
data-shape="rectangular"
data-theme="outline"
data-text="signin_with"
data-size="large"
data-logo_alignment="left">
</div>
<script>
function handleCredentialResponse(response) {
console.log(response.credential)
const decodedJwt = decodeJwt(response.credential);
console.log(decodedJwt)

console.log("ID: " + decodedJwt.sub);
console.log('Full Name: ' + decodedJwt.name);
console.log('Given Name: ' + decodedJwt.given_name);
console.log('Family Name: ' + decodedJwt.family_name);
console.log("Image URL: " + decodedJwt.picture);
console.log("Email: " + decodedJwt.email);
}

function decodeJwt(token) {
const base64Url = token.split('.')[1];
const base64 = base64Url.replace('-', '+').replace('_', '/');
return JSON.parse(window.atob(base64));
}

</script>
</body>
</html>

要求是在 JWT/idToken 中获取自定义声明(基于自定义用户属性或组以支持 API 网关上的 RBAC)。实现这一目标的最佳方法是什么?

这是我试过的。

  1. 我关注了这个adding-custom-roles-to-jwt-on-login-with-google-identity-platform文章并将 beforeSignIn Hook 链接到返回硬编码自定义声明的云函数
    const gcipCloudFunctions = require('gcip-cloud-functions');
const authClient = new gcipCloudFunctions.Auth();
exports.beforeSignIn = authClient.functions().beforeSignInHandler((user, context) => {
console.log({
user,
context
});
return {
customClaims: {
"roleCustomClaim": "SomeRole"
}
};
});

此方法不适用于我在上面分享的 gsi(谷歌身份服务)客户端代码段。云函数未执行(使用日志验证)这是为什么?

  1. 我在 Identity Platform 的提供商选项卡中添加了“Google”身份提供商,并使用上面代码段中使用的相同内部 Web 客户端对其进行了配置。

<html>
<body>
<script src="https://www.gstatic.com/firebasejs/8.0/firebase.js"></script>
<script>
var config = // config copied from identity platform's "Application setup details"
firebase.initializeApp(config);
const provider = new firebase.auth.GoogleAuthProvider();
const auth = firebase.auth();
firebase.auth()
.signInWithPopup(provider)
.then((result) => {
console.log(result)
/** @type {firebase.auth.OAuthCredential} */
var credential = result.credential;
const idToken = credential.idToken;
console.log(idToken)
const decodedJwt = decodeJwt(idToken);
console.log(decodedJwt)
// This gives you a Google Access Token. You can use it to access the Google API.
var token = credential.accessToken;
// The signed-in user info.
var user = result.user;
console.log(user)
// ...
}).catch((error) => {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// The email of the user's account used.
var email = error.email;
// The firebase.auth.AuthCredential type that was used.
var credential = error.credential;
// ...
});

function decodeJwt(token) {
const base64Url = token.split('.')[1];
const base64 = base64Url.replace('-', '+').replace('_', '/');
return JSON.parse(window.atob(base64));
}

</script>
</body>
</html>

现在云函数正在用户登录时以 200 状态执行,但我仍然没有在 jwt/idToken 中获得自定义声明。知道我做错了什么吗?

我可以看到一条警告“注意:阻止功能仅适用于 Identity Platform。Firebase 身份验证不支持它们。”在 Customizing the authentication flow using blocking functions但这令人困惑,因为 Google Identity 平台的文档甚至应用程序设置详细信息都指向 firebase 并且正在使用 firebase SDK。

最佳答案

result.user.getIdTokenResult() 方法结果中的

token 包含在 GCP 云函数的 authClient.functions().beforeSignInHandler 处理程序中添加的自定义声明。我正在检查不包含任何自定义声明的 result.credential.idToken

传递自定义声明的另一种更好的方法是使用 Google workspace SAML 应用程序与 Google Identity Platform 的集成。这种方式可以将任何 Google Directory 属性(内置或自定义)传递给身份平台,而无需创建任何云函数(尽管这种方法仍然支持通过云函数进行扩展)

SAM custom attribute mapping

带有自定义声明的 jwt 示例(您可以在我们的 SAML 提供商(即 google workspace)提供的 sign_in_attributes 中看到 stackoverflowRole):

{
"iss": "https://securetoken.google.com/some-project-123456",
"aud": "some-project-123456",
"auth_time": 1657706938,
"user_id": "someuserid",
"sub": "someuserid",
"iat": 1657706938,
"exp": 1657710538,
"email": "someuser@customdomain.com",
"email_verified": true,
"firebase": {
"identities": {
"saml.customdomain.com": [
"someuser@customdomain.com"
],
"email": [
"someuser@customdomain.com"
]
},
"sign_in_provider": "saml.customdomain.com",
"sign_in_attributes": {
"firstName": "Abdul",
"lastName": "Rauf",
"groups": "custom-superuser",
"stackoverflowRole": "superuser"
}
}
}

引用:

关于google-cloud-platform - 如何在从谷歌工作区登录获得的 JWT/idToken 中添加自定义声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72898510/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com