使用OAuth2 / OIDC的RESTful API身份验证和SSO

时间:2019-07-02 16:23:56

标签: rest oauth oauth-2.0 openid-connect restful-authentication

想象一下以下常见情况。我有一个单页Web应用程序(SPA),它使用我在后端编写的RESTful API接收所有数据。

这些API也完全可以用于第三方。我的单页应用程序是使用API​​的数百万种应用程序中的另一种。在后台维护会话是为了进行身份验证和缓存。该会话通过具有会话ID的cookie持续。

要使用API​​,用户必须进行身份验证。我需要为我的应用程序支持大型SSO方法(OIDC / OAUTH2)。显然,我的API需要被Dell Boomi或plain ol'SSIS之类的集成软件使用。


现在,让我们谈谈身份验证和授权流程。经过数天的阅读,我了解了关于OAuth2和OpenID的所有内容,我想象以下工作流程。 myapp.com配置为通过Facebook(任意)进行SSO:

  1. [Web浏览器]:GET /customer/1> [API服务器]
  2. [API服务器]:Dunno you, chump. 302 redirect here, plz.> [浏览器] https://www.facebook.com/oauth/login?client_id=abcdef&state=12345
  3. [浏览器]:Username: lintlicker, password: iluvcats123> [Facebook]
  4. [Facebook]:Yup, you're someone. 302 redirect here, plz.> [浏览器] https://www.myapp.com/oauth/imback?code=a1b2c3d&state=12345
  5. [Web浏览器]:json of the stuff from the url> [API服务器]
  6. [API服务器]:Here's a code and client-id and client-secret> [Facebook]
  7. [Facebook]:Here's a token to run Facebook APIs for this user ................................

但是,等等。我不想运行Facebook API。我只想使用Facebook进行身份验证,然后运行我的应用程序的API ...已经看到我误解了OAuth和OIDC。

好的,所以Facebook是使用OpenID的身份验证者。但是OAuth可以在我的API的外部使用吗?

我的API服务器基本上应该将来自浏览器/请求者的OAuth请求转发给身份提供者是谁吗?然后,我发送回一个在一个小时内到期的访问令牌,而不是一个cookie,而不是cookie中的会话ID。然后浏览器负责重新令牌吗?

这是否意味着浏览器或请求者具有客户端密码?明显不是。那么那是否意味着我必须使用/支持已贬值的隐式授予方法?

这里有什么好的架构?

1 个答案:

答案 0 :(得分:0)

通过使用SSO,您的目标似乎可以提供社交登录行为。为此,您无需依赖Facebook发行的令牌。您可以做的是从ID令牌中获取用户数据,或者通过调用公开身份提供者的API(例如:Facebook)的用户信息来获取用户数据,并将其存储在后端之一中。从那时起,您就可以通过自己的令牌或会话来维护身份验证状态。

关于其他集成(API到API),对于那些集成,您的后端可以在成功完成OAuth流(例如:-客户端证书授予)后发布令牌。并且,如果这种集成带有第三方令牌(例如:Facebook),则您的后端可以允许令牌交换(如果需要,还可以添加用户注册,注册)。

上述方法的缺点是后端需要处理这些请求。如果可能的话,我建议嵌入一个轻量级的身份提供程序。这应该使所有东西都开箱即用。