我正在开发一个使用 Okta 作为身份提供商的 Next.js 应用程序。我是 OIDC 的新手,感谢对我的术语或误解的任何更正。
该应用程序使用 Okta 中的自定义 API 授权服务器,用户使用授权码流程登录。目前,授权服务器配置了许多自定义范围,这些范围定义了可以授予用户的权限,所有这些范围都是默认范围。我们使用访问策略来控制根据组成员身份将哪些默认策略授予用户,作为基于角色的访问控制的一种形式。因此,如果用户是
MyAppReadWrite
组的成员,除了授权代码流程中所需的 myapp:api:read
之外,他们还可以获得 myapp:api:write
和 openid
范围。
我在here看到的下一个身份验证的默认选项是请求
openid
、email
和profile
:
export default function Okta<P extends OktaProfile>(
options: OAuthUserConfig<P>
): OAuthConfig<P> {
return {
id: "okta",
name: "Okta",
type: "oauth",
wellKnown: `${options.issuer}/.well-known/openid-configuration`,
authorization: { params: { scope: "openid email profile" } },
idToken: true,
profile(profile) {
return {
id: profile.sub,
name: profile.name ?? profile.preferred_username,
email: profile.email,
image: profile.picture,
}
},
style: { logo: "/okta.svg", bg: "#000", text: "#fff" },
options,
}
}
当我登录到应用程序并内省从 Okta 返回的令牌时,它正确地具有我所期望的这三个范围(及其相关的声明)。但是,通过直接在 Postman 中与授权服务器交互,我知道如果我完全省略范围参数,Okta 会向我发回我匹配的访问策略中允许的任何默认范围。我想在下一个身份验证中做同样的事情,以便用户在登录时自动获得适合其角色的范围。我尝试通过将范围设置为
undefined
或 ""
来覆盖这些默认值,但是当我这样做时,我的登录尝试失败并出现错误 Try signing in with a different account.
如何在对 Okta 的下一个身份验证请求中完全省略范围?或者,如果有更合适的方法可以为 Okta 中的用户角色颁发正确的范围,如果不通过默认范围和访问策略,我该如何实现这一点?
谢谢!
您可以请求您想要的所有范围,无论用户是否有权访问它们。即使您要求其他范围,Okta 也只会返回授权范围。
我相信 Okta 提供商有一些默认设置。如果您想完全删除它们,您还可以基于当前的 Okta 提供程序创建自定义提供程序并完全删除范围参数。 NextAuth 没有针对所有提供商的内部默认设置。