📖 Scenario: You are building a WordPress site that offers a custom API endpoint. To protect this API, you need to add authentication so only authorized users can access it.
🎯 Goal: Build a simple authentication mechanism for a WordPress REST API endpoint using a custom API key.
📋 What You'll Learn
Create a PHP array to store valid API keys
Add a variable to hold the current request's API key
Write a function to check if the API key is valid
Register a REST API route that uses the authentication function
💡 Why This Matters
🌍 Real World
Many WordPress sites offer custom APIs for mobile apps or integrations. Securing these APIs with authentication prevents unauthorized access and protects data.
💼 Career
Understanding how to add authentication to WordPress REST APIs is important for backend developers, WordPress plugin developers, and anyone building secure web services.
Progress0 / 4 steps
1
DATA SETUP: Create API keys array
Create a PHP array called $valid_api_keys with these exact string values: 'key123', 'key456', and 'key789'.
Wordpress
Hint
Use a PHP array with the exact variable name $valid_api_keys and the exact keys listed.
2
CONFIGURATION: Get API key from request headers
Add a variable called $api_key that gets the value of the 'X-API-KEY' header from the current request using getallheaders().
Wordpress
Hint
Use getallheaders() to get headers, then access 'X-API-KEY' safely with the null coalescing operator.
3
CORE LOGIC: Create authentication check function
Write a function called is_api_key_valid that takes $key as a parameter and returns true if $key is in the $valid_api_keys array, otherwise false.
Wordpress
Hint
Use in_array with strict checking to verify the key is valid.
4
COMPLETION: Register REST API route with authentication
Use register_rest_route to create a route '/custom/v1/data' that accepts GET requests. Add a permission_callback that calls is_api_key_valid($api_key) to allow access only if the API key is valid.
Wordpress
Hint
Use add_action('rest_api_init', ...) to register the route and add the permission callback that calls is_api_key_valid.
Practice
(1/5)
1. What is the main purpose of permission_callback in WordPress REST API authentication?
easy
A. To format the API response data
B. To define the URL of the API endpoint
C. To register a new API route
D. To check if the user has permission to access the API endpoint
Solution
Step 1: Understand the role of permission_callback
This callback function is used to verify if the current user has the right permissions to access a specific API route.
Step 2: Differentiate from other API registration parts
Other parts like route URL and response formatting are handled separately; permission_callback specifically controls access.
Final Answer:
To check if the user has permission to access the API endpoint -> Option D
A. The callback function 'get_info' is missing parameters
B. The 'methods' value should be an array, not a string
C. The 'permission_callback' should be a callable, not a function call string
D. The route namespace 'myplugin/v1' is invalid
Solution
Step 1: Check the type of permission_callback
permission_callback must be a callable function, not the result of a function call. Here, 'current_user_can('read')' is a string calling the function immediately, which is incorrect.
Step 2: Correct usage of permission_callback
It should be a callable like a function name or anonymous function that returns a boolean when called by the API.
Final Answer:
The 'permission_callback' should be a callable, not a function call string -> Option C
Quick Check:
permission_callback must be callable, not called [OK]
Hint: permission_callback needs a callable, not a called function [OK]
Common Mistakes:
Passing function call result instead of callable
Using string with quotes incorrectly
Confusing methods string vs array
5. You want to create a WordPress REST API endpoint that only logged-in users with the 'edit_posts' capability can access. Which of these permission_callback implementations correctly enforces this?
hard
A. permission_callback => function() { return is_user_logged_in(); }
B. permission_callback => function() { return is_user_logged_in() && current_user_can('edit_posts'); }
C. permission_callback => function() { return current_user_can('read'); }
D. permission_callback => function() { return true; }
Solution
Step 1: Understand the requirement
The endpoint must allow only logged-in users who have the 'edit_posts' capability.
Step 2: Analyze each permission_callback
permission_callback => function() { return is_user_logged_in() && current_user_can('edit_posts'); } checks both if the user is logged in and if they have the capability, fulfilling the requirement exactly.
Step 3: Why other options fail
A only checks login without the 'edit_posts' capability. B checks current_user_can('read') which many users have but not 'edit_posts'. D allows everyone.