doc: update enable-authentication-and-restriction, jwt-auth and wolf-rbac examples. (#1018)

Co-authored-by: Jintao Zhang <tao12345666333@163.com>
diff --git a/docs/en/latest/practices/enable-authentication-and-restriction.md b/docs/en/latest/practices/enable-authentication-and-restriction.md
index e95b9b6..530eea6 100644
--- a/docs/en/latest/practices/enable-authentication-and-restriction.md
+++ b/docs/en/latest/practices/enable-authentication-and-restriction.md
@@ -29,27 +29,116 @@
 

 ### Authentication

 

-#### [`keyAuth`](https://apisix.apache.org/docs/apisix/plugins/key-auth/)

+#### Key Auth

 

-Consumers add their key either in a header `apikey` to authenticate their requests.

+Consumers add their key either in a header or query string parameter to authenticate their requests. For more information about `Key Auth`, please refer to [APISIX key-auth plugin](https://apisix.apache.org/docs/apisix/plugins/key-auth/).  

+Also, we can using the `secretRef` field to reference a K8s Secret object so that we can avoid the hardcoded sensitive data in the ApisixConsumer object. For reference Secret use example, please refer to the [key-auth-reference-secret-object](#key-auth-reference-secret-object).

+

+<details>

+  <summary>Key Auth yaml configure</summary>

 

 ```yaml

-keyAuth:

-  value:

-    key: ${key}

+apiVersion: apisix.apache.org/v2beta3

+kind: ApisixConsumer

+metadata:

+  name: ${name}

+spec:

+  authParameter:

+    keyAuth:

+      value:

+        key: ${key} #required

 ```

 

-#### [`basicAuth`](https://apisix.apache.org/docs/apisix/plugins/basic-auth/)

+</details>

 

-Consumers add their key either in a header `Authentication` to authenticate their requests.

+#### Basic Auth

+

+Consumers add their key in a header to authenticate their requests. For more information about `Basic Auth`, please refer to [APISIX basic-auth plugin](https://apisix.apache.org/docs/apisix/plugins/basic-auth/).  

+Also, we can using the `secretRef` field to reference a K8s Secret object so that we can avoid the hardcoded sensitive data in the ApisixConsumer object. For reference Secret use example, please refer to the [key-auth-reference-secret-object](#key-auth-reference-secret-object).

+

+<details>

+  <summary>Basic Auth yaml configure</summary>

 

 ```yaml

-basicAuth:

-  value:

-    username: ${username}

-    password: ${password}

+apiVersion: apisix.apache.org/v2beta3

+kind: ApisixConsumer

+metadata:

+  name: ${name}

+spec:

+  authParameter:

+    basicAuth:

+      value:

+        username: ${username} #required

+        password: ${password} #required

 ```

 

+</details>

+

+#### JWT Auth

+

+The consumer then adds its key to the query string parameter, request header, or cookie to verify its request. For more information about `JWT Auth`, please refer to [APISIX jwt-auth plugin](https://apisix.apache.org/docs/apisix/plugins/jwt-auth/).  

+Also, we can using the `secretRef` field to reference a K8s Secret object so that we can avoid the hardcoded sensitive data in the ApisixConsumer object. For reference Secret use example, please refer to the [key-auth-reference-secret-object](#key-auth-reference-secret-object).

+

+:::note Need to expose API  

+This plugin will add `/apisix/plugin/jwt/sign` to sign. You may need to use `public-api` plugin to expose it.  

+:::

+

+<details>

+  <summary>JWT Auth yaml configure</summary>

+

+```yaml

+apiVersion: apisix.apache.org/v2beta3

+kind: ApisixConsumer

+metadata:

+  name: ${name}

+spec:

+  authParameter:

+    wolfRbac:

+      value:

+        key: "${key}"                                    #required

+        secret: "${secret}"                              #optional

+        public_key: "${public_key}"                      #optional, required when algorithm attribute selects RS256 algorithm.

+        private_key: "{private_key}"                     #optional, required when algorithm attribute selects RS256 algorithm.

+        algorithm: "${HS256 | HS512 | RS256}"            #optional

+        exp: ${ 86400 | token's expire time, in seconds} #optional

+        algorithm: ${true | false}                       #optional

+```

+

+</details>

+

+#### `Wolf RBAC`

+

+To use wolfRbac authentication, you need to start and install [wolf-server](https://github.com/iGeeky/wolf/blob/master/quick-start-with-docker/README.md). For more information about `Wolf RBAC`, please refer to [APISIX wolf-rbac plugin](https://apisix.apache.org/zh/docs/apisix/plugins/wolf-rbac/).  

+Also, we can using the `secretRef` field to reference a K8s Secret object so that we can avoid the hardcoded sensitive data in the ApisixConsumer object. For reference Secret use example, please refer to the [key-auth-reference-secret-object](#key-auth-reference-secret-object).

+

+:::note This plugin will add several APIs

+

+* /apisix/plugin/wolf-rbac/login

+* /apisix/plugin/wolf-rbac/change_pwd

+* /apisix/plugin/wolf-rbac/user_info

+

+You may need to use `public-api` plugin to expose it.  

+:::

+

+<details>

+  <summary>Wolf RBAC yaml configure</summary>

+

+```yaml

+apiVersion: apisix.apache.org/v2beta3

+kind: ApisixConsumer

+metadata:

+  name: ${name}

+spec:

+  authParameter:

+    wolfRBAC:

+      value:

+      server: "${server of wolf-rbac}"                            #optional

+      appid: "${appid of wolf-rbac}"                              #optional

+      header_prefix: "${X- | X-UserId | X-Username | X-Nickname}" #optional

+```

+

+</details>

+

 ### [Restriction](https://apisix.apache.org/docs/apisix/plugins/consumer-restriction/)

 

 #### `whitelist` or `blacklist`

@@ -57,6 +146,9 @@
 `whitelist`: Grant full access to all users specified in the provided list, **has the priority over `allowed_by_methods`**  

 `blacklist`: Reject connection to all users specified in the provided list, **has the priority over `whitelist`**

 

+<details>

+  <summary>whitelist or blacklist with consumer-restriction yaml configure</summary>

+

 ```yaml

 plugins:

 - name: consumer-restriction

@@ -67,10 +159,15 @@
     - "${consumer_name}"

 ```

 

+</details>

+

 #### `allowed_by_methods`

 

 HTTP methods can be `methods:["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS", "CONNECT", "TRACE", "PURGE"]`

 

+<details>

+  <summary>allowed_by_methods with consumer-restriction yaml configure</summary>

+

 ```yaml

 plugins:

 - name: consumer-restriction

@@ -79,15 +176,19 @@
     allowed_by_methods:

     - user: "${consumer_name}"

       methods:

-      - "POST"

-      - "GET"

+      - "${GET | POST | PUT |...}"

+      - "${GET | POST | PUT |...}"

     - user: "${consumer_name}"

       methods:

-      - "GET"

+      - "${GET | POST | PUT |...}"

 ```

 

+</details>

+

 ## Example

 

+[Refer to the corresponding e2e test case.](../../../../test/e2e/suite-features/consumer.go)

+

 ### Prepare env

 

 To use this tutorial, you must deploy `Ingress APISIX` and `httpbin` in Kubernetes cluster.

@@ -103,9 +204,11 @@
 

 ### How to enable `Authentication`

 

+#### Enable `keyAuth`

+

 The following is an example. The `keyAuth` is enabled on the specified route to restrict user access.  

 

-Create ApisixConsumer foo:

+* Creates an ApisixConsumer, and set the attributes of plugin `key-auth`:

 

 ```shell

 kubectl apply -f - <<EOF

@@ -121,7 +224,7 @@
 EOF

 ```

 

-ApisixRoute:

+* Creates an ApisixRoute, and enable plugin `key-auth`:

 

 ```shell

 kubectl apply -f - <<EOF

@@ -134,7 +237,7 @@
   - name: rule1

     match:

       hosts:

-      - local.httpbin.org

+      - httpbin.org

       paths:

       - /*

     backends:

@@ -146,10 +249,183 @@
 EOF

 ```

 

-Requests from foo:

+* Requests from foo:

 

 ```shell

-kubectl  exec -it -n ${namespace of Apache APISIX} ${pod of Apache APISIX}  -- curl http://127.0.0.1:9080/anything -H 'Host: local.httpbin.org' -H 'apikey:foo-key' -i

+kubectl  exec -it -n ${namespace of Apache APISIX} ${pod of Apache APISIX}  -- curl http://127.0.0.1:9080/anything -H 'Host: httpbin.org' -H 'apikey:foo-key' -i

+```

+

+```shell

+HTTP/1.1 200 OK

+...

+```

+

+##### Key Auth reference Secret object

+

+<details>

+  <summary>ApisixRoute with keyAuth consumer using secret example</summary>

+

+* Creates a `Secret` object:

+

+```shell

+kubectl apply -f - <<EOF

+apiVersion: v1

+kind: Secret

+metadata:

+  name: foovalue

+data:

+  key: Zm9vLWtleQ==

+EOF

+```

+

+* Creates an ApisixConsumer and reference `Secret` object:

+

+```shell

+kubectl apply -f - <<EOF

+apiVersion: apisix.apache.org/v2beta3

+kind: ApisixConsumer

+metadata:

+  name: foo

+spec:

+  authParameter:

+    keyAuth:

+      secretRef:

+        name: foovalue

+EOF

+```

+

+* Creates an ApisixRoute, and enables plugin `key-auth`:

+

+```shell

+kubectl apply -f - <<EOF

+apiVersion: apisix.apache.org/v2beta3

+kind: ApisixRoute

+metadata:

+  name: httpserver-route

+spec:

+  http:

+  - name: rule1

+    match:

+      hosts:

+      - httpbin.org

+      paths:

+      - /*

+    backends:

+    - serviceName: httpbin

+      servicePort: 80

+    authentication:

+      enable: true

+      type: keyAuth

+EOF

+```

+

+* Requests from foo:

+

+```shell

+kubectl  exec -it -n ${namespace of Apache APISIX} ${pod of Apache APISIX}  -- curl http://127.0.0.1:9080/anything -H 'Host: httpbin.org' -H 'apikey:foo-key' -i

+```

+

+```shell

+HTTP/1.1 200 OK

+...

+```

+

+</details>

+

+#### Enable `JWT Auth`

+

+* Creates an ApisixConsumer, and set the attributes of plugin `jwt-auth`:

+

+```shell

+kubectl apply -f - <<EOF

+apiVersion: apisix.apache.org/v2beta3

+kind: ApisixConsumer

+metadata:

+  name: foo2

+spec:

+  authParameter:

+    jwtAuth:

+      value:

+        key: foo2-key

+EOF

+```

+

+* Use the `public-api` plugin to expose the public API:

+

+```shell

+kubectl apply -f - <<EOF

+apiVersion: apisix.apache.org/v2beta3

+kind: ApisixRoute

+metadata:

+  name: default

+spec:

+  http:

+  - name: public-api

+    match:

+      paths:

+      - /apisix/plugin/jwt/sign

+    backends:

+    - serviceName: apisix-admin

+      servicePort: 9180

+    plugins:

+    - name: public-api

+      enable: true

+EOF

+```

+

+* Creates an ApisixRoute, and enable the jwt-auth plugin:

+

+```shell

+kubectl apply -f - <<EOF

+apiVersion: apisix.apache.org/v2beta3

+kind: ApisixRoute

+metadata:

+ name: httpbin-route

+spec:

+ http:

+ - name: rule1

+   match:

+     hosts:

+     - httpbin.org

+     paths:

+       - /*

+   backends:

+   - serviceName: httpbin

+     servicePort: 80

+   authentication:

+     enable: true

+     type: jwtAuth

+EOF

+```

+

+* Get the token:

+

+```shell

+kubectl  exec -it -n ${namespace of Apache APISIX} ${pod of Apache APISIX} -- curl http://127.0.0.1:9080/apisix/plugin/jwt/sign?key=foo2-key -H 'Host: httpbin.org' -i

+```

+

+```shell

+HTTP/1.1 200 OK

+...

+eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ1c2VyLWtleSIsImV4cCI6MTU2NDA1MDgxMX0.Us8zh_4VjJXF-TmR5f8cif8mBU7SuefPlpxhH0jbPVI

+```

+

+* Without token:

+

+```shell

+kubectl  exec -it -n ${namespace of Apache APISIX} ${pod of Apache APISIX} -- curl http://127.0.0.1:9080/anything -H 'Host: httpbin.org' -i

+```

+

+```shell

+HTTP/1.1 401

+...

+{"message":"Missing JWT token in request"}

+```

+

+* Request header with token:

+

+```shell

+kubectl  exec -it -n ${namespace of Apache APISIX} ${pod of Apache APISIX} -- curl http://127.0.0.1:9080/anything -H 'Host: httpbin.org' -H 'Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ1c2VyLWtleSIsImV4cCI6MTU2NDA1MDgxMX0.Us8zh_4VjJXF-TmR5f8cif8mBU7SuefPlpxhH0jbPVI' -i

 ```

 

 ```shell

@@ -167,7 +443,7 @@
 

 * **consumer_name**: Add the `username` of `consumer` to a whitelist or blacklist (supporting single or multiple consumers) to restrict access to services or routes.

 

-Create ApisixConsumer jack1:

+* Create ApisixConsumer jack1:

 

 ```shell

 kubectl apply -f - <<EOF

@@ -183,7 +459,7 @@
 EOF

 ```

 

-Create ApisixConsumer jack2:

+* Create ApisixConsumer jack2:

 

 ```shell

 kubectl apply -f - <<EOF

@@ -199,7 +475,7 @@
 EOF

 ```

 

-ApisixRoute:

+* Creates an ApisixRoute, and enable config `whitelist`  of the plugin `consumer-restriction`:

 

 ```shell

 kubectl apply -f - <<EOF

@@ -212,7 +488,7 @@
  - name: rule1

    match:

      hosts:

-     - local.httpbin.org

+     - httpbin.org

      paths:

        - /*

    backends:

@@ -250,10 +526,10 @@
 

 **Example usage**

 

-Requests from jack1:

+* Requests from jack1:

 

 ```shell

-kubectl  exec -it -n ${namespace of Apache APISIX} ${pod of Apache APISIX} -- curl http://127.0.0.1:9080/anything -H 'Host: local.httpbin.org' -H 'apikey:jack1-key' -i

+kubectl  exec -it -n ${namespace of Apache APISIX} ${pod of Apache APISIX} -- curl http://127.0.0.1:9080/anything -H 'Host: httpbin.org' -H 'apikey:jack1-key' -i

 ```

 

 ```shell

@@ -261,10 +537,10 @@
 ...

 ```

 

-Requests from jack2:

+* Requests from jack2:

 

 ```shell

-kubectl  exec -it -n ${namespace of Apache APISIX} ${pod of Apache APISIX} -- curl http://127.0.0.1:9080/anything -H 'Host: local.httpbin.org' -H 'apikey:jack2-key' -i

+kubectl  exec -it -n ${namespace of Apache APISIX} ${pod of Apache APISIX} -- curl http://127.0.0.1:9080/anything -H 'Host: httpbin.org' -H 'apikey:jack2-key' -i

 ```

 

 ```shell

@@ -277,6 +553,8 @@
 

 This example restrict the user `jack2` to only `GET` on the resource.

 

+* Creates an ApisixRoute, and enable config `allowed_by_methods`  of the plugin `consumer-restriction`:

+

 ```shell

 kubectl apply -f - <<EOF

 apiVersion: apisix.apache.org/v2beta3

@@ -288,7 +566,7 @@
  - name: rule1

    match:

      hosts:

-     - local.httpbin.org

+     - httpbin.org

      paths:

        - /*

    backends:

@@ -314,10 +592,10 @@
 

 **Example usage**

 

-Requests from jack1:

+* Requests from jack1:

 

 ```shell

-kubectl  exec -it -n ${namespace of Apache APISIX} ${pod of Apache APISIX} -- curl http://127.0.0.1:9080/anything -H 'Host: local.httpbin.org' -H 'apikey:jack1-key' -i

+kubectl  exec -it -n ${namespace of Apache APISIX} ${pod of Apache APISIX} -- curl http://127.0.0.1:9080/anything -H 'Host: httpbin.org' -H 'apikey:jack1-key' -i

 ```

 

 ```shell

@@ -326,7 +604,7 @@
 ```

 

 ```shell

-kubectl  exec -it -n ${namespace of Apache APISIX} ${pod of Apache APISIX} -- curl http://127.0.0.1:9080/anything -H 'Host: local.httpbin.org' -H 'apikey:jack1-key' -d '' -i

+kubectl  exec -it -n ${namespace of Apache APISIX} ${pod of Apache APISIX} -- curl http://127.0.0.1:9080/anything -H 'Host: httpbin.org' -H 'apikey:jack1-key' -d '' -i

 ```

 

 ```shell

@@ -334,10 +612,10 @@
 ...

 ```

 

-Requests from jack2:

+* Requests from jack2:

 

 ```shell

-kubectl  exec -it -n ${namespace of Apache APISIX} ${pod of Apache APISIX} -- curl http://127.0.0.1:9080/anything -H 'Host: local.httpbin.org' -H 'apikey:jack2-key' -i

+kubectl  exec -it -n ${namespace of Apache APISIX} ${pod of Apache APISIX} -- curl http://127.0.0.1:9080/anything -H 'Host: httpbin.org' -H 'apikey:jack2-key' -i

 ```

 

 ```shell

@@ -346,7 +624,7 @@
 ```

 

 ```shell

-kubectl  exec -it -n ${namespace of Apache APISIX} ${pod of Apache APISIX} -- curl http://127.0.0.1:9080/anything -H 'Host: local.httpbin.org' -H 'apikey:jack2-key' -d '' -i

+kubectl  exec -it -n ${namespace of Apache APISIX} ${pod of Apache APISIX} -- curl http://127.0.0.1:9080/anything -H 'Host: httpbin.org' -H 'apikey:jack2-key' -d '' -i

 ```

 

 ```shell

@@ -370,7 +648,7 @@
  - name: rule1

    match:

      hosts:

-     - local.httpbin.org

+     - httpbin.org

      paths:

        - /*

    backends:

@@ -394,10 +672,8 @@
 EOF

 ```

 

-Requests:

-

 ```shell

-kubectl  exec -it -n ${namespace of Apache APISIX} ${pod of Apache APISIX}  -- curl http://127.0.0.1:9080/anything -H 'Host: local.httpbin.org' -i

+kubectl  exec -it -n ${namespace of Apache APISIX} ${pod of Apache APISIX}  -- curl http://127.0.0.1:9080/anything -H 'Host: httpbin.org' -i

 ```

 

 ```shell