学习如何引导 Hydra

2018阿里云全部产品优惠券(好东东,强烈推荐)
领取地址 https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=zo93kaue

推荐:微信公众平台OAuth2.0网页授权php示例

[ 1、配置授权回调页面域名,如 www.aaa.com   2、模拟公众号的第三方网页,fn_system.php <php if(empty($_SESSION['user'])){ header("Location:http://www

OAuth 2.0 和 OpenID

OAuth 2.0 和 OpenID 的基本概念体现在用户想对一个应用程序(“Application X”)执行某个操作时。访问该应用程序需要访问一个公司或企业(“Service Z”)的帐户,而对这个帐户的访问需要代表用户进行授权。为了以良好且安全的方式允许授权(不违背用户对直接请求其凭证的信任),您可以将诸如 Hydra 之类的工具集成到 Service Z 中,使 Application X 能代表用户发出经过授权的请求。

了解 Hydra

需要进一步了解 OAuth 2.0?

阅读我们广受欢迎的系列 “Java 编程中的 OAuth 2.0 客户端,第 1 部分”

如果您还不理解运行 OAuth 2.0 服务器的用例,那么理解为什么像 Hydra 这样的工具必不可少在一开始时可能并不那么容易。简言之,Hydra 是一个非常简单的 OAuth 2.0 授权服务器。这种身份验证服务的用例的最佳示例(或您想要这个工具的最明显原因)是,您创建了一个 API,并想让第三方能够访问您的 API(例如代表用户访问)。

下图可以很好地帮助理解基本概念,并给出了授权代码流的高级概述。

图 1:Hydra 流程

有一些帮助您了解 OAuth2.0 和 OpenID Connect 的资源,其中包括 这个来自 DigitalOcean 的指南 。另外, 这个指南 展示了人们通常如何将 OAuth 2.0 集成到移动应用程序中,还提供了在 Facebook 或 Google 等网站上遇到这种情况的示例场景。

安装 Hydra

要运行并安装 Hydra,有 3 种基本方式。就个人而言,我推荐利用 Docker 映像或容器来使用并运行 Hydra,这也是本文中运行该服务器的方式。考虑到以后的开发者,运行 Hydra 的其他方式包括从官方版本下载一个二进制文件,或从源代码进行构建。因为我们也将在我们的主机上运行 Hydra 来连接到服务器,所以您也应该将它安装到本地。但是,如果您习惯从连接到 Hydra 服务器的 Docker 容器运行所有命令,则没有必要将它安装到本地。从二进制文件安装相对容易一些,只需要从 项目版本页 下载各自的版本并将它们安装在 PATH 中的某处。或者如果您使得二进制文件成为可执行文件,那么可以直接调用它。

在 macOS 上,让 PATH 变得可执行的方式非常简单:

延伸阅读

在 OpenPOWER 服务器上使用 Docker Swarm 模式

使用 Docker 容器网络

chmod +x hydra-darwin-amd64
./hydra-darwin-amd64 -h

要从源代码进行构建,需要安装并正确配置 golang 1.8 或更高版本 (配置 PATH 并确保 go get 工作正常)。来自 Hydra gitbooks 页面的指令非常简单: https://ory.gitbooks.io/hydra/content/install.html#build-from-source

通过 Docker 设置 Hydra

因为设置 Hydra 服务器应该是与应用程序无关的,所以大部分步骤都来自官方指南。出于本文的目的,我们将使用 Docker,因为已有一些相关的 Docker 映像,而且它使我们能轻松地运行该服务器,使我们能理解该流程的工作原理而无需担心相关细节。

在启动 Hydra 服务器之前,我们想启动一个数据库。 PostgresMySQL 都是不错的数据库选择。要启动您的数据库,您需要在运行该服务器之前使用一个内置 migrate 命令来迁移并创建各种模式。为了演示如何使用 Hydra,我们将使用一个内存型数据库,所以我们暂时无需担心迁移过程。请注意,使用这个数据库只是为了帮助理解,它并不适用于所有生产用例。另请注意,我们在整个过程中使用了各种各样的标志(比如 --dangerous-force-http ),使用它们也是为了完成测试和方便理解。

要启动并运行 Hydra,您需要运行以下命令:

docker run -d \
 --name hydra-server \
 -p 9000:4444 \
 -e SYSTEM_SECRET=$SYSTEM_SECRET \
 -e DATABASE_URL=$DATABASE_URL \
 -e ISSUER=https://localhost:9000/ \
 -e CONSENT_URL=http://localhost:3000/consent \
 -e FORCE_ROOT_CLIENT_CREDENTIALS=admin:admin-password \
 oryd/hydra:latest --dangerous-force-http --dangerous-auto-logon --disable-telemetry

使用 SSL 的说明

尽管我们没有对本文的设置使用任何安全措施(这有点讽刺意味,因为这是一个安全应用程序),但我们不使用安全措施是为了让大家能理解使同意流工作的最基本流程。 我们使用的许多标志和选项不应该用于测试或学习以外的用途。 例如,推荐对 Hydra 服务器(以及其他许多实体)使用 SSL。有关在生产环境中运行此程序的待办事项的完整列表,请阅读官方文档。要使用 SSL(这是一个不错的主意),需要在启动 Hydra 服务器时有一个密钥和证书。为此,最简单的方法是根据指南(比如这个来自 heroku 的指南)在您的主机上使用 Openssl

在这一步中,需要访问 Hydra 服务器,以便可以在以后设置示例客户端。因为我们没有从已在运行的 Docker 容器这么做,所以我们有多种设置示例客户端的方法。一种方法是启动另一个拥有 Hydra 的 Docker 容器,并连接到容器 shell,而不是运行 Hydra 服务器并连接到该服务器。该方法很不错,但是为了展示其他方法,我们将在主机上运行 Hydra 并将它连接到 Docker 容器。

本地使用 Hydra

从版本页下载一个 Hydra 二进制文件并将它添加到您的 $PATH 。从这里,您能够连接到已在主机上运行的 Docker 化的 Hydra 容器:

hydra connect --url https://localhost:9000 --id admin --secret admin-password

推荐:快速理解Docker - 容器级虚拟化解决方案

[简单的说Docker是一个构建在LXC之上的,基于进程容器(Processcontainer)的轻量级VM解决方案]

为确保它是有效的,可以创建和验证一个令牌:

hydra token validate --skip-tls-verify $(hydra token client --skip-tls-verify)

接下来,设置 Hydra 客户端和策略:

hydra clients create --skip-tls-verify \
  --id consent-app \
  --secret consent-secret \
  --name "Consent App Client" \
  --grant-types client_credentials \
  --response-types token \
  --allowed-scopes hydra.consent 

hydra policies create --skip-tls-verify \ 
  --actions get,accept,reject \
  --description "Allow consent-app to manage OAuth2 consent requests."\
  --allow \
  --id consent-app-policy \
  --resources "rn:hydra:oauth2:consent:requests:<.*>" \
  --subjects consent-app

备注:此刻所有这些请求在理论上可在任何地方运行,比如 cURL,或者可以通过使用 Python 或任何 OAuth2 库来自动化和简化该流程。

将 Hydra 集成到您的应用程序中

使用 Hydra 的主要目的是将它用于您的应用程序。幸运的是,官方存储库中提供了两个不错的示例,我们将使用其中的一个(Node.js 示例)。尽管 Go 应用程序很简单(参见 这里的存储库 ),但我们将使用 Node.js 示例 。这个 Express 应用程序的基本思路是,通过使用 simple-oauth2 库,从 Hydra 服务器上的 /oauth2/auth 路径请求一个访问令牌。从这里,您可以使用 Hydra SDK 创建一个客户端实例,然后使用该实例代表用户来请求同意。建立这个实例并测试它很简单,因为已经发布了一个我们可以使用的 Docker 映像。为确保一切正常,并在您想要允许访问您创建的需要最终用户同意的 API 时,从第三方角度理解如何集成它,您可以运行该映像:

docker run -d --name hydra-consent --link hydra-server:hydra -p 9020:3000 \
 -e HYDRA_CLIENT_ID=consent-app \
 -e HYDRA_CLIENT_SECRET=consent-secret \
 -e HYDRA_URL=https://hydra:4444 \
 -e NODE_TLS_REJECT_UNAUTHORIZED=0 \
 oryd/hydra-consent-app-express:latest

获取访问令牌

同意应用程序(Node.js 应用程序容器)运行后,您需要创建一个 OAuth 用户应用程序客户端。在理论上,您会将二者用于 HTTP API(或者任何完成 OAuth2 同意流的库)。现在,我们可以通过连接到 Hydra 服务器的 Hydra 二进制文件来运行这些命令。要创建该客户端并随后启动 OAuth 2.0 代码流,可运行以下命令:

hydra clients create --skip-tls-verify \
 --id some-consumer \
 --secret consumer-secret \
 -g authorization_code,refresh_token,client_credentials \
 -r token,code,id_token \
 --allowed-scopes openid,offline,hydra.clients \
 --callbacks http://localhost:9010/callback

hydra token user --skip-tls-verify \
 --auth-url https://localhost:9000/oauth2/auth \
 --token-url https://hydra:4444/oauth2/token \
 --id some-consumer \
 --secret consumer-secret \
 --scopes openid,offline,hydra.clients \
 --redirect http://localhost:9010/callback

借助此命令,您可以通过浏览器返回一个 URL(比如 https://localhost:9000/oauth2/auth?client_id=some-consumer&redirect_uri=http+various_other_data )并进行登录。要输入的凭证已在该网页上提供,而且您可以勾选所有复选框,但这里给出的是用户在执行此流程时实际选择的复选框。这只是用户最有可能看到的部分复选框,因为此流程的剩余部分是在身份验证服务器或客户端应用程序的后端启动的。您也可以涵盖返回的访问令牌(而且因为我们是在一定范围内离线提供的,所以也可以涵盖一个刷新令牌)和它的有效期。根据 Hydra 文档 的介绍,也可以对这些令牌执行撤销、检查等。或许明智的做法是,应用程序集成此流程来检查所有以前的令牌,并在必要时刷新它们。幸运的是,此操作很容易通过 Hydra 完成。

使用访问令牌

现在让我们使用身份验证令牌。尽管令牌本身可能拥有 API 的访问权,但您仍需要为用户创建一条策略,以防在默认情况下未启用它。使用我们之前通过 Hydra 二进制文件生成的访问令牌,运行以下命令:

hydra policies create --skip-tls-verify \
 --actions get \
 --allow \
 --id consent-app-policy \
 --resources "rn:hydra:clients" \
 --subjects user:12345:dandean

例如,从这里,可以使用 cURL 或 Python 来查看我们创建的所有客户端。

curl --insecure -H "Authorization: bearer `ACCESS_TOKEN_FROM_ABOVE`"
                https://localhost:9000/clients/

至此,我们已经介绍了一些流程,包括如何设置 OAuth 2.0 服务器,同意流如何在另一个 Web 应用程序中运行,以及用户如何与它交互。

补充介绍:与 Python 结合使用

将 Hydra 这样的工具与 Python 结合使用也是可行的。因为两个官方 SDK 都是使用 swagger-codegen 创建的,所以您可以按下列方式轻松地将它用于 Python:

brew install swagger-codegen
swagger-codegen generate -i ./docs/api.swagger.json -l python -o ./sdk/python/swagger

您还可以使用一种替代性 SDK,比如 python-hydra-sdk 。 对于本文,我们已将 Python SDK 推送到 此处

如果您完全通过 Python 来执行此操作,您需要采用某种方法获取初始访问令牌(如下所示)。

尽管前面已经提到过,OAuth 2.0 客户端可直接集成到 SDK 中(而且 python-flask codegen 似乎可以照常运行,只要您更改了它创建的配置文件中的 URL),但我将展示如何使用 requests_oauthlib 库获取初始身份验证令牌。

要进行此项设置,可使用 pip install requests_oauthlib 进行安装。

第一步是创建一个访问令牌,以便我们可以使用它为将要使用 Hydra 服务的用户创建策略和客户端:

from oauthlib.oauth2 import BackendApplicationClient
from requests.auth import HTTPBasicAuth

auth = HTTPBasicAuth('admin', 'admin-password') # from FORCE_ROOT_CLIENT_CREDENTIALS above
client = BackendApplicationClient(client_id=client_id)
oauth = OAuth2Session(client=client)

token = oauth.fetch_token(token_url='https://localhost:9000/oauth2/token', auth=auth, verify=False)
print(token)

现在我们得到了一个响应,如下所示:

{'access_token': '-tdmTUbaEXZLussxTD7NDUzakQ.VrpS4hOml1-
bw_5pkUlikqEs3jjvKOrPcE2hg4yNBBk', 'expires_in': 3599, 'scope': [''], 
'token_type': 'bearer', 'expires_at': 1512371155.7248588}

有了这个访问令牌,随后就可以执行创建客户端、策略等实际任务。

结束语

您现在能将 Hydra 与您创建的任何 API 结合使用,使第三方能够安全地访问该 API。这样您就能安全地验证用户的身份,而无需担心他们的安全细节。例如,无需让用户注册并将用户密码存储在一个可能泄露并造成很大麻烦的数据库中,您可以在应用程序或网站中实现一个 OAuth2 同意流,大大减少对存储隐私用户数据的担忧。此外,您的用户将感受到一种更加轻松的注册过程。

推荐:Spring Security 与 Oauth2 整合 步骤

[为什么要写1. spring-security-oauth2的demo 不容易让开发者理解, 配置的内容很多, 没有分解的步骤; 我曾经试着按照文档(https://github.com/spring-projects/spring-secu

相关推荐