loginsrv:带有OAuth2、Google、GitHub等后端的JWT登录微服务

2020-05-24 04:11:05

GitHub是5000多万开发人员的家园,他们一起工作,共同托管和审查代码、管理项目和构建软件。

报名。

loginsrv是一个独立的简约登录服务器,为多个登录后端提供JWT登录。

谷歌将停止对Google+API的支持。因此,我们将loginsrv更改为使用标准OAuth端点进行Google登录。如果您使用的是Google登录,请将loginsrv更新到v1.3.0。

从v1.3.0开始,loginsrv为登录cookie设置安全标志。因此,如果您使用HTTP与浏览器连接,例如用于测试,您的浏览器将忽略cookie。在不使用HTTPS进行测试时,请使用标志-cookie-secure=false。

Loginsrv为身份验证提供最小端点。登录针对提供程序执行,并作为JSON Web令牌(JWT)返回。它可以用作:

球童用户请注意:并非所有参数在球童中都可用。有关详细信息,请参见表。对于Caddy,参数名称也可以与名称中的_一起使用,例如cookie_http_only。

在JWT cookie上设置安全标志。(若要支持纯HTTP,请将其设置为False)

包含允许重定向的域列表的文件,每行一个域。

包含令牌的用户特定数据的YAML文件。(请参见下面的示例)。

为令牌提供用户特定数据的端点的URL。(请参见下面的示例)。

通过使用以下命名的变量,所有上述配置选项也可以作为环境变量应用:LOGINSRV_OPTION_NAME。因此,例如,JWT-SECRET可以由环境变量LOGINSRV_JWT_SECRET设置。

使用loginsrv的最简单方式是使用提供的码头容器。使用简单提供程序配置:

$docker run-d-p8080:8080tarent/loginsrv-cookie-SECURE=FALSE-JWT-SECRET MY_SECRET-SIMPLE BOB=SECRET$CURL--DATA&34;用户名=BOB&A;PASSWORD=SECRET&34;127.0.0.1:8080/logineyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJib2IifQ.uWoJkSXTLA_RvfLKe12pb4CyxQNxe5_Ovw-N5wfQwkzXz2enbhA9JZf8MmTp9n-TTDcWdY3Fd1SA72_M20G9lQ。

默认情况下,对于未经身份验证的请求,它返回一个简单的Bootstrap样式的登录表单,对于经过身份验证的请求,它返回一个包含用户信息的页面。当调用接受JSON输出时,令牌的json内容将返回到经过身份验证的请求。

返回的超文本标记语言遵循(lib-compose)[https://github.com/tarent/lib-compose],的UI合成约定,因此可以嵌入到现有布局中。

使用配置的提供程序启动OAuth Web流。例如,GET/LOGIN/GitHub重定向到GitHub登录表单。

执行登录并返回JWT。根据内容类型和参数,可以执行经典的JSON-REST或重定向。

如果登录成功并重定向到redirectSuccess或redirectError中提供的URL,则将JWT设置为Cookie。

提示:状态401 AUTHORIZED不用作不与HTTP基本身份验证冲突的返回代码。

如果缺少用户名和密码的POST参数,并且请求中包含有效的JWT-Cookie,则刷新JWT-Cookie。只有将JWT-Refresh配置选项设置为大于0的值时,才会发生这种情况。

cURL-I--DATA&34;USERNAME=BOB&;PASSWORD=SECRET http://127.0.0.1:6789/loginHTTP/1.1 200OK内容类型:应用程序/作业日期:星期一,2016年11月14日21:35:42 GMT内容长度:100eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJib2IifQ.-51G5JQmpJleARHp8rIljBczPFanWT93d_N_7LQGUXU。

Curl-i-H';内容类型:应用程序/json';--数据';{";用户名";:";bob";,";密码";:";Secret";}';http://127.0.0.1:6789/loginHTTP/1.1 200OK内容类型:应用程序/作业日期:星期一,2016年11月14日21:35:42 GMT内容长度:100eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJib2IifQ.-51G5JQmpJleARHp8rIljBczPFanWT93d_N_7LQGUXU。

示例:使用JQuery调用Ajax以获取JWT令牌并从中创建Cookie

$.ajax({url:";http://localhost:8080/login";,类型:';POST';,数据类型:';文本';,内容类型:';应用程序/json';,数据:JSON.stringify({';用户名';:';演示';,';密码';:';演示';}),SUCCESS:Function(Data){Docent.cookie=";JWT_TOKEN=";+DATA+";;path=/";;},错误:Function(xhr,ajaxOptions,thrownError){}});

API支持重定向查询参数,例如?BACKTO=/DYNAMIC/RETURN/PATH。出于安全原因,默认行为非常严格:

检查Referer标头以确保对登录页面的调用来自同一页面。

这些限制是为了防止您未经检查的重定向攻击,例如网络钓鱼或登录攻击。如果您知道您在做什么,您可以使用--redirect-check-referer=false禁用引用检查,并使用--redirect-host-file=/ome/domains.txt为允许的外部域提供白名单文件。

根据htpasswd文件进行身份验证。支持MD5、SHA1和bcrypt。但我们建议仅出于安全原因使用bcrypt(例如htpasswd-B-C15)。

密码文件的路径(可以使用';;';分隔多个文件)。

通过执行HTTP基本身份验证请求并检查HTTP 200 OK状态代码的响应,针对上游HTTP服务器进行身份验证。除200 OK状态代码以外的任何代码都将导致身份验证失败。

OSIAM是一个安全的身份管理解决方案,提供基于REST的身份验证和授权服务,它实现了多个OAuth2流,以及用于管理用户数据的SCIM。

要针对同一台计算机上的默认OSIAM配置启动loginsrv,请使用以下示例。

Simple是一个演示提供程序,仅用于测试。它在内存中保存一个用户/密码表。

还支持OAuth Web流(也称为3条腿的OAuth流)。目前支持以下OAuth提供程序:

在外部OAuth提供程序配置OAuth参数时,必须提供重定向URI。此重定向URI必须指向路径/login/<;Provider>;。如果未提供,则根据当前URL计算OAuth重定向URI。如果正确设置了报头X-Forwarded-Host和X-Forwarded-Proto,这在大多数情况下都应该有效,甚至在loginsrv通过反向代理路由的情况下也应该有效。

自定义模板可以通过参数template提供,您可以在login/login_form.go中找到原始模板。

指定自定义模板时,仅替换原始模板的布局。原始文件的分音仍会加载到模板上下文中,并可由您的模板使用。因此,最小的未设置样式的登录模板可能如下所示:

<;!DOCTYPE html>;<;html>;<;Head>;<;!--您的样式-->;<;Head>;<;正文<;!--您的页眉-->;{{if.Error}}<;div class=";alert-dangge";角色=";alert";&。<;/strong>;请稍后重试。<;/div>;{{end}}{{if.Authenticated}}{{template";userInfo";。}}{{Else}}{{Template";login";。}}{{end}}<;!--您的页脚-->;<;/body>;<;/html>;

要定制JWT令牌的内容,可以提供包含用户数据的文件或提供声明的端点。

用户文件是包含在令牌中编码的附加信息的YAML文件。在Backend系统认证成功后,在文件中搜索用户,并使用Claims参数的内容来增强用户的JWT索赔参数。

要匹配条目,将以线性顺序搜索用户文件,并且所有属性都必须与身份验证后端的数据匹配。将使用第一个匹配条目,并且声明属性以下的所有参数都将写入令牌。以下属性可用于匹配:

组-数组中包含的用户组的完整路径字符串(仅限GitLab)。

用户admin@example.org在使用Google OAuth进行身份验证时将变为";角色";:";admin";和";项目";:[";示例";]。

具有域示例的所有其他Google用户将成为";角色";:";用户";和";项目";:[";示例";]。

-SUB:Bob Origin:htpasswd Claims:Role:superAdmin-Email:admin@example.org Origin:Google Claims:Role:Admin Projects:-Example-domain:example.org Origin:Google Claims:Role:User Projects:-Example-Groups:-Example/Subgroup-thergroup Origin:GitLab Claims:Role:Admin-Claims:Role:UNKNOWN。

用户端点是提供关于认证用户的附加信息的HTTP端点。在针对后端系统成功进行身份验证后,将调用端点,并使用提供的信息来增强用户JWT声明参数。

组-数组中包含的用户组的完整路径字符串(仅限GitLab)

获取/claims?origin=google&;sub=test@example.com&;email=test@example.com HTTP/1.1主机:本地主机:8080接受:*/*授权:持有者令牌HTTP/1.1200OK内容类型:应用程序/json{";sub";:";test@example.com";,";uid";:";113";,";原始";:";google";,";权限";:[";读取";,";写入";]}