如何在后台启用Google登录?
How to enable sign-in with Google on Backstage?
在 Backstage 上,完成 https://backstage.io/docs/auth/google/provider 上的所有步骤后,我收到消息“Google 提供程序未配置为支持登录” SSO 接口。
如果我理解正确,我必须将 Backstage 设置为 enable/allow Google 提供商以登录用户。但是我不知道该怎么做。
如何配置 Google 供应商以支持后台登录?
您似乎错过了后端应用程序的身份验证插件配置 mentioned in the docs
您应该创建一个解析器函数来将 google 的用户身份映射到后台的用户身份,或者可以选择跳过目录的用户查找(此方法有一些注意事项)。
以下文档解释了解析器功能和用户身份:Sign-in Identities and Resolvers
以下代码是如何在不映射到后台用户身份的情况下实现 google 解析器的示例,我建议仅将其用于 测试目的 和,如前所述,此方法有一些注意事项。
我强烈建议您了解文档以及将外部用户身份映射到后台用户身份所释放的力量。
./packages/backend/src/plugins/auth.ts
import { createRouter, providers } from '@backstage/plugin-auth-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
import { DEFAULT_NAMESPACE, stringifyEntityRef, } from '@backstage/catalog-model';
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
...env,
providerFactories: {
google: providers.google.create({
signIn: {
resolver: async ({ profile }, ctx) => {
if (!profile.email) {
throw new Error(
'Login failed, user profile does not contain an email',
);
}
const [localPart] = profile.email.split('@');
const userEntityRef = stringifyEntityRef({
kind: 'User',
name: localPart,
namespace: DEFAULT_NAMESPACE,
});
return ctx.issueToken({
claims: {
sub: userEntityRef,
ent: [userEntityRef],
},
});
},
},
}),
},
});
}
在 Backstage 上,完成 https://backstage.io/docs/auth/google/provider 上的所有步骤后,我收到消息“Google 提供程序未配置为支持登录” SSO 接口。
如果我理解正确,我必须将 Backstage 设置为 enable/allow Google 提供商以登录用户。但是我不知道该怎么做。
如何配置 Google 供应商以支持后台登录?
您似乎错过了后端应用程序的身份验证插件配置 mentioned in the docs
您应该创建一个解析器函数来将 google 的用户身份映射到后台的用户身份,或者可以选择跳过目录的用户查找(此方法有一些注意事项)。
以下文档解释了解析器功能和用户身份:Sign-in Identities and Resolvers
以下代码是如何在不映射到后台用户身份的情况下实现 google 解析器的示例,我建议仅将其用于 测试目的 和,如前所述,此方法有一些注意事项。 我强烈建议您了解文档以及将外部用户身份映射到后台用户身份所释放的力量。
./packages/backend/src/plugins/auth.ts
import { createRouter, providers } from '@backstage/plugin-auth-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
import { DEFAULT_NAMESPACE, stringifyEntityRef, } from '@backstage/catalog-model';
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
...env,
providerFactories: {
google: providers.google.create({
signIn: {
resolver: async ({ profile }, ctx) => {
if (!profile.email) {
throw new Error(
'Login failed, user profile does not contain an email',
);
}
const [localPart] = profile.email.split('@');
const userEntityRef = stringifyEntityRef({
kind: 'User',
name: localPart,
namespace: DEFAULT_NAMESPACE,
});
return ctx.issueToken({
claims: {
sub: userEntityRef,
ent: [userEntityRef],
},
});
},
},
}),
},
});
}