GoAhead4 - 用户认证

一. 前言

        身份验证是在授予对服务器资源的访问权限之前验证客户端身份和功能的过程。当你拥有要保护的内容并且仅提供给特定的,已批准的客户端访问时,身份验证是必不可少的。

        GoAhead实现了一个既强大又灵活的身份验证框架,该框架使用了一个基于角色(role)的授权机制验证用户名和密码并验证客户端的能力。

二. 认证方案

        表单身份验证方案使用HTML的web表单供用户输入其用户名和密码凭据以及对提交到服务器的HTTP的POST请求进行验证,它也可以通过HTTP的POST请求以编程方式使用。      

        基本身份认证和摘要认证是由HTTP/1.1 RFC2616规范定义的HTTP协议机制。由于它们在协议层运行,因此它们提供的功能和灵活性较低。当客户端尝试访问受保护的内容时,客户端的浏览器会显示一个通用的弹出对话框,提示输入用户凭据。

1. 认证和授权配置:

        认证是由两个配置文件控制,auth.txt和route.txt文件。这两个文件共同定义了用于对GoAhead的每个请求的身份验证方案。运行GoAhead时,将读取auth.txt和route.txt文件,并为每个指定的URI模式创建经过身份验证的路由。当收到哭护短请求时,它们将与URI路由匹配,以查找所需的身份验证方案。这提供了很大的灵活性,因为不同的情况可以使用不同的身份验证方案。

1. 授权配置:

        auth.txt文件包含用于建立身份验证数据库的用户和角色定义。如果在unix系统上运行,则可以使用标准的UNIX用户数据库,而不是在auth.txt在定义用户。        

2. 用户指令:

        用户可以通过用户指令来定义。这指定了用户的用户名、加密密码和用户所扮演的认证角色。

3. 角色指令:

        角色可以通过角色指令来定义。这指定了角色名称和一组能力词。URI路由可以要求用户在被授予访问权之前拥有某些能力。

案例如下:

role name=manager abilities=view,edit,delete
user name=joshua password=2fd6e47ff9bb70c0465fd2f5c8e5305e roles=manager

4. 路由:

        route.txt文件包含路由定义,指定每个请求URI将如何被处理,如果有的话,请求将需要什么样的认证。举例如下:

route uri=/private/ auth=digest abilities=edit
route uri=/cgi-bin handler=cgi

        auth关键字的参数设置为digest、basic或form。abilities关键字接收一个以逗号分隔的能力词列表。

三. 表单认证

        表单身份验证方案使用标准的web表单,提示用户输入用户名和密码。   此方案允许用户的登录界面具有与web应用程序其余部分有相同的样式。

     表单身份认证方案将标准的HTTP POST请求将用户名和密码提交给GoAhead。GoAhead分析用户的用户名和密码,如果身份验证通过,则会创建登录回话并将cookie返回到用户的浏览器。包含cookie的请求将自动进行验证和送达。由于用户名和密码以明文形式发送,因此仅通过SSL连接的表单验证非常的重要。

1. 基于表单的安全认证

        要使用表单身份验证有效地保护应用程序,需要五种路由来实现登录和注销过程。如下:

1. 通过 SSL 重定向所有 HTTP 流量的路由

2. 登录页面的路由,未经身份验证时必须可访问该页面

3. 登录服务的路由

4. 注销服务的路由

5. 要求对所有 URI 进行身份验证的路由

以上步骤举例如下:

route uri=/ protocol=http redirect=*@https handler=redirect
route uri=/pub/
route uri=/proc/login methods=POST handler=proc redirect=200@/ redirect=401@/pub/login.html
route uri=/proc/logout methods=POST handler=proc redirect=200@/pub/login.html
route uri=/ auth=form handler=continue redirect=401@/pub/login.html

route uri=/ protocol=http redirect=*@https handler=redirect

        此指令负责通过 SSL 重定向所有 HTTP 流量。uri=/ 定义 URI 前缀。由于所有 URI 都以 / 开头,因此此路由将匹配使用 http:// 而不是 https:// 的所有请求。

route uri=/pub/

        此指令允许对 /pub 目录中的任何文档进行未经身份验证的访问。这是登录.html表单和任何必需的CSS或Javascript文件应该位于的位置。

route uri=/proc/login methods=POST handler=proc redirect=200@/ redirect=401@/pub/login.html

        此指令定义登录服务路由。proc 处理程序将登录服务绑定到 URI /proc/login。此服务需要带有用户名和密码表单字段的 POST 请求。如果用户进行身份验证,则通过redirect=200@/重定向用户。重定向形式为:STATUS@URI。如果无法成功验证用户凭据,则会通过以下方式将用户重定向回登录页面:redirect=401@/pub/login.html。

route uri=/proc/logout methods=POST handler=proc redirect=200@/pub/login.html

        此指令定义注销服务。这只会删除用户的登录会话,并将用户重定向回登录页面。

route uri=/ auth=form handler=continue redirect=401@/pub/login.html

        此最终指令定义与所有其他 URI 匹配的路由,并规定基于表单的身份验证。继续处理程序对用户进行身份验证,如果用户成功通过身份验证,则处理将继续,让其他处理程序为请求提供服务并生成响应。如果身份验证失败,用户将被重定向回登录页面。

四. web表单认证

        最小的登录表单案例:

<html><head><title>login.html</title></head>
<body>
    <p>Please log in</p>
    <form name="details" method="post" action="/auth/login">
        Username <input type="text" name="username" value=''><br/>
        Password <input type="password" name="password" value=''><br/>
        <input type="submit" name="submit" value="OK">
    </form>
</body>
</html>

        两个提交的字段必须被命名为usernamepassword。表单身份验证方案以纯文本形式提交用户密码。为了保护通信,应通过使用 TLS/SSL 的安全连接使用表单身份验证方案。

1. 基本认证方式

        基本身份验证是最初的 HTTP/1.0 身份验证方案。它通过固定的基于浏览器的弹出对话框捕获用户名和密码,然后使用不比使用纯文本更好的简单编码传输凭据。

安全警告

        如果可能,不应使用基本身份验证。它在每个请求中传输用户凭据,对密码没有加密,也没有让用户可靠地注销的方法。如果必须使用基本身份验证,请通过 TLS/SSL 使用它,这将通过网络加密密码。

2. 基本认证

        GoAhead 基本授权是通过在 route.txt 中指定所需路由中的 auth=basic 来定义的。如下:

# In auth.txt
role name=operator abilities=start,stop
user name=julie password=9d8873a123eb506e7f8e84d1f2a26916 roles=operator
# In route.txt
route uri=/machinery auth=basic abilities=start,stop

        此示例限制对以"/machinery"开头的 URI 的访问。它允许具有启动,停止功能的用户访问。这意味着用户"julie"将在身份验证后被授予访问权限。

        auth=basic关键字指定正在使用基本授权。基本认证和摘要式认证使用的认证realm是在通过 main.me 配置文件中的领域属性构建 GoAhead 时设置的。realm与用户名和密码结合使用以加密密码。

3. 摘要认证

        摘要式身份验证方案加密技术是对基本方案的一个小改进。它通过固定的基于浏览器的弹出对话框捕获用户名和密码,然后使用弱MD5编码格式传输凭据。

安全警告

        如果可能,不应使用摘要式身份验证。它在每个请求中传输用户凭据,对密码的加密较弱,并且没有让用户可靠地注销的方法。如果必须使用摘要式身份验证,请通过 TLS/SSL 使用它,这将通过网络安全地加密凭据。

        GoAhead digest authorization is very similar to Basic authentication and is is controlled by the auth=digest keyword on required routes.

4. 密码存储

        可以构建GoAhead以从Unix系统密码数据库或密码文本配置文件中检索密码。Unix系统密码数据库通过PAM接口进行管理。可以将 GoAhead 配置为通过以下命令使用 PAM:

configure --set pam=true

5. 通过PAM确定abilities

        当使用PAM时,用户记录不需要放在auth.txt中。然而,为了确定用户的能力,用户的Unix组成员资格和角色定义被使用。对于用户是成员的每个Unix组,auth.txt中相应的角色会被检查。如果存在一个与该组同名的角色,该角色指定的能力将被添加到该用户的能力集合中。换句话说,你应该为 auth.txt 中的每个组创建一个角色定义,为该 Unix 组的用户指定能力。例如,假设一个用户joshua是Unix组 "staff "的成员。下面的 auth.txt 定义将赋予 joshua 能力:添加、编辑、删除。

role staff add,edit,delete

五. 总结

        本文详细介绍了GoAhead的三种认证方式:basic,digest和form,以及各个认证方式的特点。basic和digest认证方式都是传输的是明文密码,不安全,安全的话需要采用TLS/SSL。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GoAhead是一个轻量级的Web服务器,不提供用户登录功能。如果你想要在GoAhead中实现用户登录,你可以使用一些第三方的身份认证和授权库,例如OpenID Connect、OAuth2等。这些库可以帮助你验证用户身份、授权访问和保护你的Web应用程序。以下是一个简单的示例,演示如何使用OpenID Connect实现用户登录: 1. 安装OpenID Connect库。例如,使用Go语言的OpenID Connect库: ``` go get github.com/coreos/go-oidc ``` 2. 在GoAhead中实现OpenID Connect登录。例如: ```go package main import ( "net/http" "github.com/coreos/go-oidc" "golang.org/x/oauth2" ) var ( provider *oidc.Provider conf *oauth2.Config ) func init() { // 初始化OpenID Connect提供者 provider, _ = oidc.NewProvider(context.Background(), "https://accounts.google.com") // 初始化OAuth2配置 conf = &oauth2.Config{ ClientID: "YOUR_CLIENT_ID", ClientSecret: "YOUR_CLIENT_SECRET", Endpoint: provider.Endpoint(), RedirectURL: "http://localhost:8080/callback", Scopes: []string{oidc.ScopeOpenID, "profile", "email"}, } } func main() { // 登录页面 http.HandleFunc("/login", func(w http.ResponseWriter, r *http.Request) { url := conf.AuthCodeURL("state", oauth2.AccessTypeOffline) http.Redirect(w, r, url, http.StatusFound) }) // 回调页面 http.HandleFunc("/callback", func(w http.ResponseWriter, r *http.Request) { code := r.URL.Query().Get("code") token, _ := conf.Exchange(context.Background(), code) idToken, _ := provider.Verifier(&oidc.Config{ClientID: "YOUR_CLIENT_ID"}).Verify(context.Background(), token.Extra("id_token").(string)) name := idToken.Claims["name"].(string) email := idToken.Claims["email"].(string) // TODO: 处理用户登录信息 }) // 启动服务器 http.ListenAndServe(":8080", nil) } ``` 这是一个简单的示例,你需要替换YOUR_CLIENT_ID和YOUR_CLIENT_SECRET为你的实际值,并根据你的需要更改登录和回调页面的URL。请注意,这只是一个示例,你需要根据你的实际情况进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值