Link Search Menu Expand Document

实施认证路由

  1. 对特定的路由实施认证
  2. 全面实施认证

在许多应用程序中,希望部分路由只有在用户登录后才能访问。存在要求对整个应用程序进行身份验证,也可以仅要求特定路由进行身份验证。任何不需要身份认证的路由都可以在无需登录的情况下访问(这种情况也称为匿名访问)。

对特定的路由实施认证

如果希望部分路由只有在用户登录后才能访问:

例如,可以定义一个新的函数使/api/private下的所有路由都要求进行认证

func isAuthenticated(r *http.Request) bool {
    authHeader := r.Header.Get("Authorization")
    if authHeader == "" {
      return false
    }
    tokenParts := strings.Split(authHeader, "Bearer ")
    bearerToken := tokenParts[1]
    toValidate := map[string]string{}
    toValidate["aud"] = "api://default"
    toValidate["cid"] = "${clientId}"
    jwtVerifierSetup := jwtverifier.JwtVerifier{
            Issuer: "https://${yourXAuthDomain}/oauth2/default",
            ClaimsToValidate: toValidate
    }
    _, err := jwtVerifierSetup.New().VerifyAccessToken(bearerToken)
    if err != nil {
      return false
    }
    return true
}

然后,在你的路由中调用下面这个函数来确认授权:

if !isAuthenticated(req) {
        w.WriteHeader(http.StatusUnauthorized)
        w.Write([]byte("401 - You are not authorized for this request"))
        return
}

全面实施认证

对于某些应用程序,可能希望对所有路由访问都要求用户身份验证。

需要将前面的函数包装到中间件中,以便处理所有路由的身份认证:

func AuthMiddleware(next http.Handler) http.Handler {
  return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    authHeader := r.Header.Get("Authorization")
    if authHeader == "" {
      return false
    }
    tokenParts := strings.Split(authHeader, "Bearer ")
    bearerToken := tokenParts[1]
    toValidate := map[string]string{}
    toValidate["aud"] = "api://default"
    toValidate["cid"] = "${clientId}"
    jwtVerifierSetup := jwtverifier.JwtVerifier{
            Issuer: "https://${yourXAuthDomain}/oauth2/default",
            ClaimsToValidate: toValidate
    }
    _, err := jwtVerifierSetup.New().VerifyAccessToken(bearerToken)
    if err != nil {
      return
    }
    next.ServeHTTP(w, r)
  })
}

接下来使用handler中的中间件

http.Handle("/order/{id:[0-9]+}",Middleware(
    http.HandlerFunc(OrderHandler),
    AuthMiddleware,
)))