如何使用OAuth2实现第三方登录/注册?

时间:2017-06-12 06:21:48

标签: oauth-2.0

这是我实现这种登录/注册逻辑的计划(授权代码流程)。 (第三方仅提供OAuth2 API

首先,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并在URL中公开可由SPA捕获的代码,然后它会将代码发送到真正的后端回调。

GET https://mysite/api/real-callback?code=dummycode

当后端获取代码时,它会将代码发送给第三方以交换access_token。当后端获得access_token时,它将触发API请求以获取用户的openid,然后决定是让用户登录还是注册为新用户。最后,它会向我们的SPA前端发回HTTP响应,其中包含我的 OAuth2系统中的access_token或401未经授权的响应。

所以我的问题是如何证明真正的回调是由我的自己的客户端调用的(因为如果一些攻击者得到我的前端嵌入client_id那么他可以伪造OAuth2请求和网络钓鱼用户同意。之后攻击者将获得一个有效的代码,然后他将代码发送回我真正的回调。最后,他将在我的系统中获得用户的access_token。)我如何使用OAuth2在没有最终用户提供密码等附加信息的情况下进行身份验证。

1 个答案:

答案 0 :(得分:1)

我建议您将OAuth2流更改为隐式,并同时请求access_tokenid_token(OpenID Connect)。您的SPA将获得令牌,将ID令牌发送到您的后端,后端可以使用它来决定是否可以创建此类用户。 SPA可以使用访问令牌来调用受保护的资源。

这样,

  • 只有SPA才是OAuth2客户端 - 两个应用程序(SPA和后端)不会使用令牌,
  • 您只有一个重定向URI
  • 您无需将令牌从后端转移到SPA。

更新:没有OpenID Connect

如果您无法使用id_token,则可以将access_token发送到您的后端,后端可以通过向令牌端点{{3}发送令牌来获取用户的用户名(来自响应username属性)。 username属性是可选的。您的OAuth2服务器可能会返回更多信息(例如姓名和电子邮件)。

此Introspection端点需要身份验证,因此要使用它,您的后端必须是具有自己的client_id和密码的已注册OAuth2客户端。