Go Iris 实现认证与授权

Go Iris 实现认证与授权

1. 常见的认证类型

HTTP Basic Auth

在HTTP中,基本认证(Basic access authentication)是一种用来允许网页浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。

虽然基本认证非常容易实现,但该方案创建在以下的假设的基础上,即:客户端和服务器主机之间的连接是安全可信的。特别是,如果没有使用SSL/TLS这样的传输层安全的协议,那么以明文传输的密钥和口令很容易被拦截。该方案也同样没有对服务器返回的信息提供保护。

OAUth2.0

OAuth在"客户端"与"服务提供商"之间,设置了一个授权层(authorization layer)。“客户端"不能直接登录"服务提供商”,只能登录授权层,以此将用户与客户端区分开来。"客户端"登录授权层所用的令牌(token),与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。

"客户端"登录授权层以后,"服务提供商"根据令牌的权限范围和有效期,向"客户端"开放用户储存的资料。

OAuth2的基本流程为:

  1. 第三方应用请求用户授权。
  2. 用户同意授权,并返回一个凭证(code)
  3. 第三方应用通过第二步的凭证(code)向授权服务器请求授权
  4. 授权服务器验证凭证(code)通过后,同意授权,并返回一个资源访问的凭证(Access Token)。
  5. 第三方应用通过第四步的凭证(Access Token)向资源服务器请求相关资源。
  6. 资源服务器验证凭证(Access Token)通过后,将第三方应用请求的资源返回。

JWT 认证

JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,可以在各方之间作为JSON对象安全地传输信息。 此信息可以通过数字签名进行验证和信任。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。

JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样:

{
   
    "name":    name, // 用户名
    "exp":      time.Now().Add(time.Hour * 2).Unix(), // 添加过期时间
}

以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名;

2. Iris 实现HTTP BASIC认证

HTTP BASIC认证过程

  1. 客户端向服务器请求数据,请求的内容可能是一个网页或者是一个其它的MIME类型,此时,假设客户端尚未被验证,则客户端提供如下请求至服务器:
  Get /index.html HTTP/1.0

  Host: www.yourhost.com
  1. 服务器向客户端发送验证请求代码401,服务器返回的数据:
  HTTP/1.0 401 Unauthorised
  Server: nginx/1.0
  WWW-Authenticate: Basic realm="yourhost.com"
  Content-Type: text/html
  Content-Length: xxx
  1. 当符合http1.01.1规范的客户端浏览器收到401返回值时,将自动弹出一个登录窗口,要求用户输入用户名和密码
  2. 用户输入用户名和密码后,将用户名及密码以BASE64加密方式加密,并将密文放入前一条请求信息中,则客户端发送的第一条请求信息则变成如下内容:
  Get /index.html HTTP/1.0
  Host: www.yourhost.com
  Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx //加密串
  1. 服务器收到上述请求信息后,将Authorization字段后的用户信息取出、解密,将解密后的用户名及密码与用户数据库进行比较验证, 如用户名及密码正确,服务器则根据请求,将所请求资源发送给客户端

示例程序:

该示例程序首先将全局路由重定向到/admin,在/admin,使用authHandler中间件进行登录处理,主要在于使用ctx.Request().BasicAuth()函数:

// basic.go
package main

import (
    "time"
    "github.com/kataras/iris"
    "github.com/kataras/iris/middleware/basicauth"
)

func main() {
   
    app := iris.New()
    authConfig := basicauth.Config{
   
        Users:   map[string]string{
   "myusername": "mypassword", "mySecondusername": "mySecondpassword"},
        Realm:   "Authorization Required", // 默认表示域 "Authorization Required"
        Expires: time.Duration(30) * time.Minute,
    }
    authentication := basicauth.New(authConfig)
    //作用范围 全局 app.Use(authentication) 或者 (app.UseGlobal 在Run之前)
    //作用范围 单个路由 app.Get("/mysecret", authentication, h)
    app.Get("/", func(ctx iris.Context) {
    ctx.Redirect("/admin") })
    //作用范围  Party
    needAuth := app.Party("/admin", authentication)
    {
   
        //http://localhost:8080/admin
        needAuth.Get("/", authHandler)
        // http://localhost:8080/admin/profile
        needAuth.Get("/profile", authHandler)
        // http://localhost:8080/admin/settings
        needAuth.Get("/settings", authHandler)
    }
    // open http://localhost:8080/admin
    app.Run(iris.Addr(":8080"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值