2017-06-12 156 views
6

这是我的计划(授权代码流程)实现这种登录/注册逻辑。 (第三方仅提供了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进行身份验证。

+0

你没有将真实回调URL作为来自OAuth2服务器的重定向URL的原因是什么?我没有看到任何将验证码发送到SPA前端的理由。 –

+0

@JánHalaša即使没有这个步骤,只要我在第三方的OAuth2回调请求后发回系统的'access_token'到前端,安全问题依然存在。我设计真正的回调的原因是我想实现前端和后端之间的真正分离。 – bitweaver

+0

你在SPA中需要什么'access_token'? –

回答

1

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

这样,

  • 只有SPA将是一个OAuth2用户端 - 令牌不能由两个应用程序(SPA和后端)一起使用,
  • 你将有只有一个重定向URI,
  • 您不需要将后端的令牌传输到SPA。

更新:如果没有ID连接

如果您不能使用id_token,你可以发送access_token到你的后端和后端可以通过发送至令牌反省端点https://tools.ietf.org/html/rfc7662获取用户的用户名(来自响应username属性)。 username属性是可选的。您的OAuth2服务器可能会返回更多信息(例如姓名和电子邮件)。

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