这是我实现这种登录/注册逻辑的计划(授权代码流程).(第三方仅提供OAuth2 API)
首先,SPA前端将向第三方发送GET请求
GET https://www.example.com/oauth2
client_id=dummyclient
redirect_uri=https://mysite/callback
response_type=code
scope=openid
Run Code Online (Sandbox Code Playgroud)
然后,如果用户同意将他/她的openid提供给mysite,那么fronend将获得301 HTTP响应.
---> 301 https://mysite/callback?code=dummycode
Run Code Online (Sandbox Code Playgroud)
然后浏览器将页面重定向到mysite/callback它,它将重新加载SPA并在URL中公开可由SPA捕获的代码,然后它将代码发送到真正的后端回调.
GET https://mysite/api/real-callback?code=dummycode
Run Code Online (Sandbox Code Playgroud)
当后端获取代码时,它会将代码发送给第三方进行交换access_token.当后端获取时access_token,它将触发API请求以获取用户的openid,然后决定是让用户登录还是注册为新用户.最后它将回馈给我们的SPA前端HTTP响应它包含access_token在我的OAuth2系统或401未授权的响应.
所以我的问题是如何证明真正的回调是由我自己的客户调用的(因为如果一些攻击者嵌入了我的前端,client_id那么他可以伪造OAuth2请求并对用户进行网络钓鱼同意.之后攻击者将获得一个有效的代码然后他将代码发送回我真正的回调.最后,他将access_token在我的系统中获得用户.)如何在没有最终用户提供密码等附加信息的情况下使用OAuth2进行身份验证.
我建议您将 OAuth2 流程更改为隐式并要求同时提供access_token和id_token(OpenID Connect)。您的 SPA 将获取令牌,将 ID 令牌发送到您的后端,后端可以使用它来决定是否可以创建此类用户。SPA 可以使用访问令牌来调用受保护的资源。
这边走,
更新:没有 OpenID Connect
如果您无法使用id_token,您可以将 发送access_token到后端,后端可以通过将令牌发送到内省端点https://www.rfc-editor.org/rfc/rfc7662(来自响应username属性)来获取用户的用户名。该username属性是可选的。您的 OAuth2 服务器可能会返回更多信息(例如姓名和电子邮件)。
此自省端点需要身份验证,因此要使用它,您的后端必须是注册的 OAuth2 客户端,并拥有自己的client_id密码。
| 归档时间: |
|
| 查看次数: |
858 次 |
| 最近记录: |