年轻人的第一个OAuth2.0 Server:hydra
hydra 是什么呢?
- OpenID Connect certified OAuth2 Server - cloud native, security-first, open source API security for your infrastructure. Written in Go. SDKs for any language.
讲人话的话就是一个OAuth2.0的服务端框架咯,开箱即用.
OAuth是撒? QQ互联知道么?微信授权登录知道么?
扩展阅读:理解OAuth 2.0:阮一峰
开源地址:https://github.com/ory/hydra
文档地址:https://www.ory.sh/docs/guides/master/hydra/
本文结束…
开始手把手教你跑hydra server
- 全程Docker部署,请自行准备相关环境.
准备PostgreSQL 数据库/MySQL数据库
hydra支持PostgreSQL/MySQL,任君选择.
官网指导教程使用的是PostgreSQL,下面我也抄过来了,同时提供MySQL的相关操作.
启动数据库啦!!!
哦,启动之前先创建一个docker 网络.
1 | docker network create hydraguide |
启动 PostgreSQL,如下
1 | docker run \ |
或者启动MySQL
1 | docker run -p 3306:3306 \ |
启动好了自行验证一下数据库是不是正确启动和能连接上去了.
准备hydra相关环境变量
1 | # The system secret can only be set against a fresh database. Key rotation is currently not supported. This |
SYSTEM_SECRET 是hydra启动时加密数据库使用的,Mac/Linux直接使用上面的方法设置即可,windows环境下设置一下环境变量?大概是这样.
DATABASE_URL 是数据库连接配置,postgres和mysql 二选一即可.
执行迁移数据库脚本
hydra自带的,直接执行即可.
1 | docker run -it --rm \ |
正常执行的话,应该如下:
1 | Applying `client` SQL migrations... |
数据库好了,我们现在可以开始搞服务端了.
启动hydra 服务端
1 | docker run -d \ |
这里我们留意几个传入给容器的环境变量.
OAUTH2_ISSUER_URL hydra所在的地址
OAUTH2_CONSENT_URL 授权页面地址
OAUTH2_LOGIN_URL 登录页面地址
假装大家都了解OAuth2.0的流程的情况下,其实这里就流程基本就是:
XX应用请求授权
-> 跳转到OAUTH2_LOGIN_URL地址
-> 登录成功
->跳转到OAUTH2_CONSENT_URL授权页面
-> 授权成功
->回调XX应用地址并且返回相关授权code/token
-> XX应用使用code/token获取用户信息或者其他操作
启动之后看一下logs是不是hydra是不是正常启动.
常见问题:”Could not fetch private signing key for OpenID Connect - did you forget to run \”hydra migrate sql\” or forget to set the SYSTEM_SECRET?” error=”unexpected end of JSON input”
确认一下SYSTEM_SECRET有没有正常设置呀,实在不行直接在docker run的时候带入.
正常启动的话,日志如下:
1 |
|
这时候去访问:https://localhost:9000/.well-known/jwks.json
理论上是能正常输出结果的.
这个时候说明我们的hydra已经正常跑起来了.
登录/授权样例网站启动
1 | docker run -d \ |
在上面我们提过,XX应用请求授权的时候,首先是跳转到统一登录页面,
这个本质是是一个统一用户中心的应用,需要我们自行开发的.
hydra官方提供一个样例给我们来测试用,node.js写的.
项目地址:https://github.com/ory/hydra-login-consent-node
这里就是在启动这个登录/授权样例网站了.
PS:我用dotnet core也实现了一套完整的用户中心授权网站,过几天空了整理一下开源发出来.
创建oauth client 客户端
1 | docker run --rm -it \ |
没什么说的,留意一下callbacks地址即可.
其实就是XX互联里面的XX应用的一些信息.
测试hydra oauth整体授权流程
启动一个请求授权的APP,如下:
1 | docker run --rm -it \ |
启动之后访问http://127.0.0.1:9010/
大概会看到:
1 | Welcome to the example OAuth 2.0 Consumer |
点击 Authorize application 立即调整到登录页面.
登录页其实就是我们上面启动的node.js的的登录页面,即:http://localhost:9020/login?login_challenge=XXX
输入账号密码之后会跳到授权页面,即:http://localhost:9020/consent?consent_challenge=XXXX
授权选好了之后点击”” 允许授权,立即跳转回到回调地址,同时显示access token相关信息.
1 | Access Token: SwMfFOSHEFpiChmBvRtFLTeaPzCh-TNEXtxTfibgmdw.AgqJrWyn1VlH4FouUucBJSDsmcwOGDI3cHpuy2sDrpI |
这个时候我们使用Access Token去调用userinfo API,即可正常获取到用户信息.
1 | curl -X GET \ |
用户信息如下:
1 | { |
为什么这里用户信息只有一个sub呢?
因为他们实现ory-hydra-example–consent的时候什么都没加进去,
具体应该怎么做等我下次分享dotnet core实现 login-consent再说了..
嗯,本文结束.