实施认证路由
在许多应用程序中,希望部分路由只有在用户登录后才能访问。存在要求对整个应用程序进行身份验证,也可以仅要求特定路由进行身份验证。任何不需要身份认证的路由都可以在无需登录的情况下访问(这种情况也称为匿名访问)。
对特定的路由实施认证
如果希望部分路由只有在用户登录后才能访问:
例如,可以定义一个新的函数使/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,
)))