这是我的计划(授权代码流程)实现这种登录/注册逻辑。 (第三方仅提供了OAuth2 API)如何使用OAuth2实现第三方登录/注册?
首先SPA前端将发送GET请求第三方
GET https://www.example.com/oauth2
client_id=dummyclient
redirect_uri=https://mysite/callback
response_type=code
scope=openid
然后,如果用户同意给他/她的OpenID mysite然后fronend会得到一个301 HTTP响应。
---> 301 https://mysite/callback?code=dummycode
然后,浏览器将网页重定向到mysite/callback
,它会重新加载SPA以及其中可以通过SPA被捕获,然后将代码发送到真正的后端回调URL暴露的代码。
GET https://mysite/api/real-callback?code=dummycode
当后台获取代码,将代码发送给第三方,以便交换access_token
。当后端获得access_token
时,它将触发API请求以获取用户的openid,然后决定是让用户登录还是注册为新用户。最后,它会向我们的SPA前端返回一个HTTP响应,其中包含access_token
,我的 OAuth2系统或401未经授权的响应。
所以我的问题是,如何证明真正的回调由我自己的客户调用(因为如果一些攻击者得到我的前端嵌入client_id
那么他就可以伪造的OAuth2请求和网络钓鱼的用户同意。此后,攻击者将得到一个有效的代码,然后他将代码发送回我真正的回调。最后,他将在我的系统中获得用户的access_token
。)如何在没有最终用户提供密码等附加信息的情况下使用OAuth2进行身份验证。
你没有将真实回调URL作为来自OAuth2服务器的重定向URL的原因是什么?我没有看到任何将验证码发送到SPA前端的理由。 –
@JánHalaša即使没有这个步骤,只要我在第三方的OAuth2回调请求后发回系统的'access_token'到前端,安全问题依然存在。我设计真正的回调的原因是我想实现前端和后端之间的真正分离。 – bitweaver
你在SPA中需要什么'access_token'? –