带有ORY Hydra,Vapor 3和iOS 12的OAuth2

在本教程中,我们尝试为您提供有关如何使用iOS应用,Vapor API和Hydra作为OAuth2服务器来实现OAuth2授权代码流的广泛理解。

教程系列

第1部分:ORY Hydra授权服务器的介绍和设置(您在这里)
第2部分:Vapor后端中的用户管理
第3部分:将Vapor后端设置为ORY Hydra的身份提供者
第4部分:使用AppAuth在iOS上设置OAuth2授权

  • 您至少需要Mac才能构建iOS应用。 这对于调试Vapor后端也很有帮助。
  • 您需要安装Docker(https://www.docker.com/get-started)
  • 您应该对OID2授权代码与OpenID Connect的工作原理有基本的了解。 有很多资源,例如,您可以查看DigitalOcean的介绍。
  • 请注意,本教程将仅在您的本地计算机上设置所有内容,并且被认为不适合生产。 例如,我们会将客户端机密存储在iOS应用程序中,您绝对不要这样做。 如果有需求,我们可能会在本教程的其他部分中着重于使整个设置生产就绪。

我们正在开发一个涉及安全性的产品,因此,依靠最佳实践用户身份验证绝对是必经之路。 设置OAuth2通常很麻烦。 ORY Hydra减轻了您实现自己的OAuth2服务器的负担,但仍要求/允许您使用自己的身份提供者。 这使我们感到困惑,哪些身份验证流程的哪些部分需要作为身份提供者的一部分在我们的后端中实现,哪些部分由Hydra提供。 在本教程中,我们将尝试更清楚地说明在开发使用Vapor后端和Hydra作为OAuth2服务器的iOS应用时,每个部件要承担什么责任。

这是我们完成后应用程序的外观:

iOS应用

iOS应用程序本质上将非常简单,并且仅具有两个本机屏幕:登录提示屏幕和成功屏幕,向您显示您已成功验证用户身份。 我们将使用AppAuth在应用程序内部处理OAuth令牌。

蒸气后端

蒸气后端将包含用户管理,并且还将作为身份和同意提供者来提供HTML登录和注册屏幕。 同意步骤将自动跳过,因为像这样的第一方应用程序不需要此步骤。 我们可以假设一个想要在我们平台上登录的用户也想要为其数据授予访问权限。

ORY九头蛇

Hydra是一个开放源代码的OAuth2服务器,它通过将用户身份验证(登录,注册)委派给身份提供者(在本例中为Vapor后端)来管理授权流程。 如果成功,它将发出访问令牌,刷新令牌和ID令牌,这些令牌可用于验证后端访问受限数据(即用户个人资料)的请求。

这可能已经令人困惑,所以让我们通过分解设置所需的内容来更好地理解它:

  • iOS应用程序需要了解Hydra服务器的身份验证和令牌终结点(公共API),但是它们完全由AppAuth库管理。
  • Vapor后端需要有权访问Hydra服务器的管理端点(管理API)以发起和接受登录和同意请求。
  • Hydra需要知道您的Vapor后端上的登录(或注册)端点和同意端点,以便将身份验证委派给您的身份提供者。 您在Hydra中创建的客户端还需要一个回调URL,以便Hydra在身份验证过程完成后知道重定向到的位置(这是一个自定义URL方案,链接到iOS应用)。

流程示例

让我们看一下用户想要注册帐户时应该发生的交互流程:

请注意,星号前缀的“实体名称”不是实际的类型,仅用于在不同阶段引用同一段代码/数据(例如“ * AuthCallback”,“ * RegistrationInput”等)。

这些图主要作为概述,您可以在本教程系列的整个课程中继续学习。 需要花很多时间,但是请记住,我们只需要实现非虚线字段并设置蓝色的Hydra部分。 在本教程的其余部分中,我们将重点关注后者。

希望您现在对我们将在此处构建的内容有了更好的了解。 现在是时候深入研究实际的实现了。 好吧……不是真的。 由于Hydra已经实现,因此只需使用一些参数启动它,并且您需要为应用程序创建一个客户端。

启动Hydra实例

我们将在本地启动Hydra服务器,并大致遵循官方示例node.js应用程序中的步骤。

首先,我们将获取最新的Hydra docker映像(在撰写本文时为v1.0.0-beta.9):

  $ docker pull oryd / hydra:v1.0.0-beta.9 

接下来,我们要在计算机上启动本地Hydra实例:

  $ docker run -it --rm --name hydra-example -p 4444:4444 -p 4445:4445 \ 
-e OAUTH2_SHARE_ERROR_DEBUG = 1 \
-e LOG_LEVEL =调试\
-e OAUTH2_CONSENT_URL = http:// localhost:8080 / auth / consent \
-e OAUTH2_LOGIN_URL = http:// localhost:8080 / auth / login \
-e OAUTH2_ISSUER_URL = http:// localhost:4444 \
-e DATABASE_URL =内存\
oryd / hydra:v1.0.0-beta.9服务于所有--dangerous-force-http

让我们看一下该命令中的不同参数:

  • --name :我们为实例命名,在本例中为hydra-example
  • -p 4444:4444 :在http://localhost:4444/上公开Hydra的公共API
  • -p 4445:4445 :在http://localhost:4445/上公开Hydra的管理API
  • OAUTH2_CONSENT_URL :定义同意提供者的URL。 处理此URL的服务是我们自己的API,我们将在本教程系列的第2部分中实现该API。
  • OAUTH2_LOGIN_URL :定义登录提供者的URL。 处理此URL的服务是我们自己的API,我们将在本教程系列的第2部分中实现该API。
  • OAUTH2_ISSUER_URL :是Hydra的公共API的URL(可用于发现公共API端点,但是在本教程中我们将不使用此功能)
  • DATABASE_URL :对于我们的本地实例,我们只将所有数据保存在内存中
  • --dangerous-force-http :此标志出于测试目的禁用SSL

该命令的输出应如下所示:

好的,就是运行我们的授权服务器!

创建一个OAuth2客户端

接下来,我们将要注册可用于测试的客户端。 在这种情况下,客户端不是指iOS客户端,而是指授权服务器的客户端。 想象一下,例如GitHub,它正在向第三方应用程序提供其授权端点。 如果要在服务中集成GitHub登录名,则需要将服务注册为GitHub授权服务器的客户端。

即使我们仅将授权服务器用于我们自己的服务,我们仍然需要将该服务注册为客户端,因此授权服务器知道允许其请求令牌。

要创建测试客户端,请运行以下命令:

  $ docker run --link hydra-example:hydra oryd / hydra:v1.0.0-beta.9客户端创建\ 
--endpoint http:// hydra:4445 \
--id test-client \
--secret test-secret \
--response-types code,id_token \
--grant-types refresh_token,authorization_code \
--scope openid,offline \
--callbacks com.example-app:/ oauth2 / callback
  • --link :告诉我们应该在哪个Hydra实例上创建客户端(在我们的示例中为hydra-example)
  • —-endpoint :这是Hydra管理API的URL
  • —-id :这是您要注册的客户端的名称,在本例中为test-client
  • —-secret :这是您要注册的客户端的秘密,在我们的例子中是test-secret
  • —-response-types :这定义了我们希望接收的响应—-response-types 。 在我们的情况下,我们希望接收授权码( code )和OpenID Connect ID令牌( id_token
  • —-grant-types :定义我们要执行的OAuth2流。 在我们的示例中,授权代码流( authorization_code )还包括刷新令牌( refresh_token
  • --scope :它定义客户端应具有的权限。 在我们的情况下,我们需要允许客户端执行OpenID Connect流( openid )并刷新过期的令牌( offline
  • —-callbacks :这定义了授权流程成功完成时,Hydra调用的重定向URI。 我们稍后需要在我们的iOS应用中注册此URL方案。

该命令的输出应如下所示:

在我们的授权服务器的日志中,您还应该看到已收到请求:

而已! 我们的授权服务器已启动并与可用客户端一起运行!

它本身不会做很多事情,因为请记住,它在很大程度上依赖于重定向到身份/同意提供者。 在下一部分中,我们将看一下如何使用Vapor来实现这一点。

接下来

第2部分:Vapor后端中的用户管理
第3部分:将Vapor后端设置为ORY Hydra的身份提供者
第4部分:使用AppAuth在iOS上设置OAuth2授权

使用OAuth2和OpenID Connect进行用户身份验证
https://oauth.net/articles/authentication/

安全地为移动应用设置OAuth2
https://www.ory.sh/oauth2-for-mobile-app-spa-browser

OpenID Connect客户端实施指南
https://openid.net/specs/openid-connect-basic-1_0.html

ORY开发人员指南:
https://www.ory.sh/docs/guides/latest/

Hydra Node.js示例:
https://github.com/ory/hydra-login-consent-node

ORY Hydra API文档:
https://www.ory.sh/docs/api/hydra/

如果您喜欢本教程,并且对我们的其他文章感兴趣,请在此处或在Twitter上关注我们,并查看我们的网站!