【发布时间】:2023-03-21 22:06:01
【问题描述】:
我对我想使用的 OpenId Connect 策略有一些顾虑,但我无法找到有关可能存在的安全问题以及我忽略的任何明显问题的详细信息。
目前,我有一个使用 Openiddict 和授权代码流的 OpenId Connect 实现。对于客户端,我有一个使用 react-native-app-auth 的 React-Native 应用程序。
我从关于 SO 的其他问题和 Openiddict 存储库上发布的问题中看到,推荐给第三方提供商(例如 Google)的方法是:Client -> Auth server -> Google Auth -> Auth server - > 客户端/验证服务器代码和令牌交换
但是,从 UX 的角度来看(使用 SPA 或本机应用程序时)似乎更好的方法是在客户端上实现类似于 GoogleSignIn 的东西,并使用 IdToken 或授权代码处理服务器上的身份谷歌。这引入了一个问题,因为之前推荐的流程无法用作整个初始挑战,并且已跳过从 Auth 服务器到 Google Auth 的重定向。
我已经看到,通过不使用授权代码授权,而是实施自定义断言授权,这个问题得到了缓解。这似乎是一种不错的方法,但需要公开自定义授权并在客户端和服务器上以不同方式处理本地和第三方登录的流程。
我提出的解决方案继续使用授权代码流,而不是添加自定义授权类型,客户端只需在 OIDC 授权请求的附加参数中传递第三方标识符“Google”和令牌或授权代码。然后,授权端点可以检测提供者和令牌,执行令牌验证,从中创建用户或主体,并创建授权代码以发送回客户端以进行代码/令牌交换。此流程如下所示:
1.从提供者处获取 id 令牌 Client -> GoogleSignIn -> Client
2。将令牌传递给身份验证服务器并启动代码/令牌交换 客户端 -> 身份验证服务器 -> 身份验证服务器验证 Google IdToken(JWKS、发行者、受众、提供商特定验证等)或交换身份验证代码-> 身份验证服务器 -> 客户端/身份验证服务器代码和令牌交换
这种方法的一个缺点是在服务器端验证令牌的额外跃点。如果令牌是从 GoogleSignIn 返回的,他们自己说它是可以信任的。 https://developers.google.com/identity/protocols/oauth2/openid-connect#obtainuserinfo
我看到一般建议将认证服务器放在客户端和第三方之间,但在这个过程中,服务器仍然在客户端和认证服务器之间,但只有在客户端和第三方进行初始交换之后.
问题,
-
总的来说,我在这个流程中遗漏了什么吗?
-
在这种情况下,是否需要在服务器端验证令牌?
-
有没有更好的方法来解决我完全忽略的问题?
-
我是不是把它弄得太复杂了,用户体验不应该是这么大的问题?
-
将提供程序和令牌添加到附加参数中是否更有意义?我没有看到通过查询字符串传递它的问题,但这也是我理解授权代码授予的部分原因。
对于我为了简洁而遗漏或遗漏的任何内容,我应该提前道歉。
谢谢。
【问题讨论】:
标签: react-native oauth-2.0 openid-connect openiddict appauth