- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个简单的“使用 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)。实现这一目标的最佳方法是什么?
这是我试过的。
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(谷歌身份服务)客户端代码段。云函数未执行(使用日志验证)这是为什么?
<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 属性(内置或自定义)传递给身份平台,而无需创建任何云函数(尽管这种方法仍然支持通过云函数进行扩展)
带有自定义声明的 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/
我是一名优秀的程序员,十分优秀!