sample: net: http: Add Basic auth support to server sample
Basic auth support was missing from HTTP server sample. Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
This commit is contained in:
parent
31faeca511
commit
11aee50eef
3 changed files with 99 additions and 1 deletions
|
@ -217,6 +217,27 @@ and this is the HTML message that wget will save:
|
||||||
<body><h1><center>404 Not Found</center></h1></body>
|
<body><h1><center>404 Not Found</center></h1></body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
To test the HTTP Basic Authentication functionality, use the
|
||||||
|
following command:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
wget 192.168.1.120/auth -O index.html --user=zephyr --password=0123456789
|
||||||
|
|
||||||
|
the :file:`index.html` file will contain the following information:
|
||||||
|
|
||||||
|
.. code-block:: html
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Zephyr HTTP Server</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1><center>Zephyr HTTP server</center></h1>
|
||||||
|
<h2><center>user: zephyr, password: 0123456789</center></h2>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
HTTPS Server
|
HTTPS Server
|
||||||
============
|
============
|
||||||
|
|
||||||
|
@ -274,4 +295,3 @@ Known Issues and Limitations
|
||||||
|
|
||||||
- Currently, this sample application only generates HTTP responses in
|
- Currently, this sample application only generates HTTP responses in
|
||||||
chunk transfer mode.
|
chunk transfer mode.
|
||||||
- Basic authentication is not yet implemented.
|
|
||||||
|
|
|
@ -30,4 +30,12 @@
|
||||||
#define ZEPHYR_PORT 8080
|
#define ZEPHYR_PORT 8080
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define HTTP_AUTH_URL "/auth"
|
||||||
|
#define HTTP_AUTH_TYPE "Basic"
|
||||||
|
|
||||||
|
/* HTTP Basic Auth, see https://tools.ietf.org/html/rfc7617 */
|
||||||
|
#define HTTP_AUTH_REALM "Zephyr"
|
||||||
|
#define HTTP_AUTH_USERNAME "zephyr"
|
||||||
|
#define HTTP_AUTH_PASSWORD "0123456789"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -17,6 +17,11 @@
|
||||||
#include <zephyr.h>
|
#include <zephyr.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/* For Basic auth, we need base64 decoder which can be found
|
||||||
|
* in mbedtls library.
|
||||||
|
*/
|
||||||
|
#include <mbedtls/base64.h>
|
||||||
|
|
||||||
#include <net/net_context.h>
|
#include <net/net_context.h>
|
||||||
#include <net/http.h>
|
#include <net/http.h>
|
||||||
|
|
||||||
|
@ -77,6 +82,10 @@ void panic(const char *msg)
|
||||||
"Transfer-Encoding: chunked\r\n" \
|
"Transfer-Encoding: chunked\r\n" \
|
||||||
"\r\n"
|
"\r\n"
|
||||||
|
|
||||||
|
#define HTTP_401_STATUS_US "HTTP/1.1 401 Unauthorized status\r\n" \
|
||||||
|
"WWW-Authenticate: Basic realm=" \
|
||||||
|
"\""HTTP_AUTH_REALM"\"\r\n\r\n"
|
||||||
|
|
||||||
#define HTML_HEADER "<html><head>" \
|
#define HTML_HEADER "<html><head>" \
|
||||||
"<title>Zephyr HTTP Server</title>" \
|
"<title>Zephyr HTTP Server</title>" \
|
||||||
"</head><body><h1>" \
|
"</head><body><h1>" \
|
||||||
|
@ -167,6 +176,65 @@ static int http_response_soft_404(struct http_server_ctx *ctx)
|
||||||
HTML_FOOTER);
|
HTML_FOOTER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int http_response_auth(struct http_server_ctx *ctx)
|
||||||
|
{
|
||||||
|
return http_response(ctx, HTTP_STATUS_200_OK, HTML_HEADER
|
||||||
|
"<h2><center>user: "HTTP_AUTH_USERNAME
|
||||||
|
", password: "HTTP_AUTH_PASSWORD
|
||||||
|
"</center></h2>" HTML_FOOTER);
|
||||||
|
}
|
||||||
|
|
||||||
|
int http_response_401(struct http_server_ctx *ctx, s32_t timeout)
|
||||||
|
{
|
||||||
|
return http_response_wait(ctx, HTTP_401_STATUS_US, NULL, timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int http_basic_auth(struct http_server_ctx *ctx)
|
||||||
|
{
|
||||||
|
const char auth_str[] = HTTP_CRLF "Authorization: Basic ";
|
||||||
|
char *ptr;
|
||||||
|
|
||||||
|
ptr = strstr(ctx->req.field_values[0].key, auth_str);
|
||||||
|
if (ptr) {
|
||||||
|
char output[sizeof(HTTP_AUTH_USERNAME) +
|
||||||
|
sizeof(":") +
|
||||||
|
sizeof(HTTP_AUTH_PASSWORD)];
|
||||||
|
size_t olen, ilen, alen;
|
||||||
|
char *end, *colon;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
memset(output, 0, sizeof(output));
|
||||||
|
|
||||||
|
end = strstr(ptr + 2, HTTP_CRLF);
|
||||||
|
if (!end) {
|
||||||
|
return http_response_401(ctx, K_NO_WAIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
alen = sizeof(auth_str) - 1;
|
||||||
|
ilen = end - (ptr + alen);
|
||||||
|
|
||||||
|
ret = mbedtls_base64_decode(output, sizeof(output) - 1,
|
||||||
|
&olen, ptr + alen, ilen);
|
||||||
|
if (ret) {
|
||||||
|
return http_response_401(ctx, K_NO_WAIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
colon = memchr(output, ':', olen);
|
||||||
|
|
||||||
|
if (colon && colon > output && colon < (output + olen) &&
|
||||||
|
memcmp(output, HTTP_AUTH_USERNAME, colon - output) == 0 &&
|
||||||
|
memcmp(colon + 1, HTTP_AUTH_PASSWORD,
|
||||||
|
output + olen - colon) == 0) {
|
||||||
|
return http_response_auth(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
return http_response_401(ctx, K_NO_WAIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wait 2 secs for the reply with proper credentials */
|
||||||
|
return http_response_401(ctx, K_SECONDS(2));
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_HTTPS)
|
#if defined(CONFIG_HTTPS)
|
||||||
/* Load the certificates and private RSA key. */
|
/* Load the certificates and private RSA key. */
|
||||||
|
|
||||||
|
@ -271,6 +339,8 @@ void main(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
http_server_add_default(&http_urls, http_response_soft_404);
|
http_server_add_default(&http_urls, http_response_soft_404);
|
||||||
|
http_server_add_url(&http_urls, HTTP_AUTH_URL, HTTP_URL_STANDARD,
|
||||||
|
http_basic_auth);
|
||||||
http_server_add_url(&http_urls, "/headers", HTTP_URL_STANDARD,
|
http_server_add_url(&http_urls, "/headers", HTTP_URL_STANDARD,
|
||||||
http_response_header_fields);
|
http_response_header_fields);
|
||||||
http_server_add_url(&http_urls, "/index.html", HTTP_URL_STANDARD,
|
http_server_add_url(&http_urls, "/index.html", HTTP_URL_STANDARD,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue