OpenID Connect,oAuth2 - 从哪里开始?

时间:2017-09-06 14:41:03

标签: oauth-2.0 api-design openid-connect

我不确定我应该采用哪种方法来实施并需要一些指导。

我在Yii2 Framework(PHP)中构建了一个REST API(api.mysite.com),可以从mysite.com(数据库)访问数据。在mysite.com上,我们的用户将能够创建连接的应用程序,这些应用程序将提供客户端ID +秘密 - 授予其帐户访问权限(全范围?)。

根据我的研究,下一步似乎是设置一些东西来实际提供传递给api的持有者令牌 - 我一直倾向于oAuth2,但后来我读到oAuth2不提供身份验证。基于此,我认为我需要OpenID Connect才能提供用户令牌,因为我的API需要根据用户上下文限制数据。

在这种方法中,我的理解是我需要一个认证服务器 - 所以有几个问题:

  • 我是否可以安装软件作为OpenID Connect / oAuth2身份验证服务器?

  • 是否有可用作OpenID Connect / oAuth2身份验证服务器的特定Amazon Web Services?

  • 我假设流程将是:App向具有客户端ID + secret的auth服务器发出请求并接收访问令牌。访问令牌可用于进行API调用。这些令牌存储在哪里(我假设一个特定于我正在使用的服务/软件的数据库?)

  • 在进行API调用时,我会传递持票人令牌和用户令牌吗?

非常感谢任何见解。

1 个答案:

答案 0 :(得分:1)

你的理解离现实并不遥远。 想象一下,你有两个服务器用于身份验证,这个服务器负责根据Authorization Basic和base64编码的CLientID / ClientSecret组合生成令牌。这基本上是应用程序认证。如果您还想添加用户数据,只需在帖子正文中传递用户名/密码,在服务器端进行身份验证,然后在令牌中添加更多数据,如用户名,声明,角色等

你可以控制你在这些令牌中放置的内容,如果你使用像JWT(Json Web Tokens)这样的东西,那么它们只是json位数据。

然后你有一个资源服务器,你用授权承载和你从授权一个获得的令牌命中它。

最初,令牌不存储在任何地方,它们会在您控制的一段时间内发出。但是,如果你真的想要,你可以做其他事情并将它们存储在数据库中。到期时间要安全得多,即使有人拿到它们也不会有多长时间可用!在我的情况下,我使用30分钟作为令牌有效期。

现在,您尚未指定要查看的语言/框架。如果您使用像dot net这样的东西,那么请查看IdentityServer,版本4用于Dot net core,3用于以下任何内容。

如果您有兴趣,我还有一篇很长的关于这个主题的文章:

https://eidand.com/2015/03/28/authorization-system-with-owin-web-api-json-web-tokens/

希望这一切澄清了你的一些问题。

- 已添加回答评论中的问题。

令牌包含资源服务器正确验证所需的所有信息,您无需将它们存储在数据库中。正如我已经说过的,你可以存储它们,但在我看来这会使它们不那么安全。不要忘记你控制令牌中的内容,这样你就可以添加用户名,如果你需要的话。

想象一下这种情况,您希望在对Authorization Server的同一调用中对应用程序和用户进行身份验证。以标准方式执行OAuth2,这意味着首先根据客户端ID /客户端密钥对应用程序进行身份验证。如果通过则接下来进行用户身份验证。将用户名或用户ID添加到您生成的令牌以及您需要的任何其他信息。这意味着资源服务器可以安全地假设在令牌中传递给它的用户名已经由身份验证服务器验证,否则首先不会生成任何令牌。

我更喜欢将这两者分开,这意味着让AS(Authorization Server)处理应用程序级别的安全性。然后在RS(资源服务器)端,您有一个端点,例如ValidateUser,它负责用户验证,之后您可以做任何您需要的事情。选择哪种感觉更适合你的项目我会说。

最后一点,始终确保所有api呼叫(AS和RS都只是api)都是通过HTTPS进行的,并且永远不会通过GET呼叫传输任何重要信息,这意味着可以拦截URL。 Headers和POST正文都通过HTTPS加密和保护。

我相信这应该解决你的两个问题。