A digression The next feature of programming HTTP clients that we will consider is user...
-
Upload
keith-leaper -
Category
Documents
-
view
217 -
download
2
Transcript of A digression The next feature of programming HTTP clients that we will consider is user...
![Page 1: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/1.jpg)
A digression
• The next feature of programming HTTP clients that we will consider is user authentication
• Before considering that, however, we will digress to consider a commonly-used user authentication technique
![Page 2: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/2.jpg)
Basic HTTP Authentication • Before giving a document to a client,
– a HTTP server looks for access-control files in every directory of the path to the document
– if it finds one, it only serves the document to the client if the client can prove entitlement
• By default, the access-control files are called .htaccess
• But, in Apache-style servers at least, a list of names for such files can be specified using the AccessFileName directive when configuring the server
(See http://httpd.apache.org/docs/1.3/mod/core.html#accessfilename )
![Page 3: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/3.jpg)
Basic HTTP Authentication (contd.) • To use Basic HTTP Authentication to control access to a directory
and its sub-directories,– create, in the directory, a file with one of the names specified in
the AccessFileName directive• normally, this means a file called .htaccess
– At its simplest, the contents of the file will look like this:AuthName "Some string to name this restricted area"
AuthType Basic
AuthUserFile path/to/some/password/file
require user valid-user
• This specifies • that only a client which can identify itself according to the password
file should be given access to this directory and its contents
• a name for the restricted area of the disk -- this name will be given to the client trying to access any file in this part of the disk, to help remind it of the right name+password to use
![Page 4: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/4.jpg)
Basic HTTP Authentication (contd.) • Suppose I want to protect all contents of the directory
http://www.cs.ucc.ie/j.bowen/cs4408/resources/demosecure/
• I could place in that directory a .htaccess file containing:AuthName "This info is restricted to CS 4408 students"
AuthType Basic
AuthUserFile /www/docs/j.bowen/cs4408/resources/.htpasswd
require user valid-user
• Then I would use the htpasswd utility provided by Apache to insert names+passwords for all eligible people into a file called .htpasswd in the parent resources directory
• Any person trying to use a browser to access this directory would receive this challenge window:
![Page 5: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/5.jpg)
Basic HTTP Authentication (contd.)
• If the user fails to provide acceptable authentication,
he/she would receive the screen shown on the bottom right
![Page 6: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/6.jpg)
Using MSIE to try to get a document from this directory
• Suppose we put a copy of showRequest2.php in this directory
• Suppose we try to use Microsoft Internet Explorer to try to read the output from showRequest2.php
• Suppose we fail to provide the correct password• We get the page shown below
![Page 7: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/7.jpg)
A "home-made browser" which attempts to get the same output
• Now suppose this "home-made" browser tries to read the same file
http://cosmos.ucc.ie/~jabowen/cs4408/myBrowser6.php <?php
require_once "HTTP/Request.php";
$req = &new HTTP_Request("http://www.cs.ucc.ie/j.bowen/cs4408/resources/demosecure/showRequest2.php");
if (!PEAR::isError($req->sendRequest()))
{ echo "<br><strong style='color:red'>Headers</strong>";
$headers = $req->getResponseHeader();
foreach ($headers as $name => $value) { echo "<br> $name = $value"; }
echo "<br><strong style='color:red'>Cookies</strong><br>";
$cookies = $req->getResponseCookies();
foreach ($cookies as $fields)
{ foreach ($fields as $name => $value) { echo "$name = $value; "; }echo "<br>"; }
$contents= $req->getResponseBody();
echo "<br><strong style='color:red'>Body</strong><br>";
echo $contents;
}?>
![Page 8: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/8.jpg)
Results of running this "browser"
• The response contains a WWW-Authenticate header, which specifies that Basic authentication is in force for this disk area, a "realm" called "This info is restricted to CS 4408 students"
• The message body contains the HTML page that we got when we tried to use Microsoft Internet Explorer
![Page 9: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/9.jpg)
A "browser" which provides authentication for this realm
• At http://cosmos.ucc.ie/~jabowen/cs4408/myBrowser7.php<?php
require_once "HTTP/Request.php";
$req = &new HTTP_Request("http://www.cs.ucc.ie/j.bowen/cs4408/resources/demosecure/showRequest2.php");
$req->setBasicAuth("peadar", "foo");if (!PEAR::isError($req->sendRequest()))
{ echo "<br><strong style='color:red'>Headers</strong>";
$headers = $req->getResponseHeader();
foreach ($headers as $name => $value) { echo "<br> $name = $value"; }
echo "<br><strong style='color:red'>Cookies</strong><br>";
$cookies = $req->getResponseCookies();
foreach ($cookies as $fields)
{ foreach ($fields as $name => $value) { echo "$name = $value; "; }echo "<br>"; }
$contents= $req->getResponseBody();
echo "<br><strong style='color:red'>Body</strong><br>";
echo $contents;
}?>
![Page 10: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/10.jpg)
Results of running this "browser"
• Request is accepted -- user+password are in SERVER vars
$PHP_AUTH_USER, $PHP_AUTH_PW which we saw, last year, when we did server-side user-authentication in a PHP program
![Page 11: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/11.jpg)
Another Approach to authentication
• Instead of depending on the server demon to defend directories, we can– make our own programs defend themselves
on a program-by-program basis
![Page 12: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/12.jpg)
PHP-based handling of passwords on both client-side and server-side
• We have just seen how to program a client to send a user+password
• Last year, we saw how to write a server-side PHP program which demanded that the client authenticate itself
• Let's revise that and see how we can use PHP for both sides of the authentication process
![Page 13: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/13.jpg)
Server-side User-authentication in PHP
• A server-side program can use the header() function to send headers requiring authentication
– This will cause a browser to pop up a username/password/realm dialog window and
– When the values have been provided by the user, the browser will send a new request back to the same page containing the appropriate information
– When ther, some special PHP variables will be set:
$PHP_AUTH_USER or $_SERVER["PHP_AUTH_USER"]
$PHP_AUTH_PW or $_SERVER["PHP_AUTH_PW"]
![Page 14: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/14.jpg)
User-authentication in PHP (contd.)
• Consider the following program which is here:
http://www.cs.ucc.ie/j.bowen/cs4408/resources/securePage.php
<?php
if ( ($_SERVER["PHP_AUTH_USER"]=='pedro') &&
($_SERVER["PHP_AUTH_PW"]=='qwerty') )
{ echo "<h1>Welcome</h1>"; }
else
{header("HTTP/1.0 401 Unauthorized");
header("WWW-Authenticate: Basic realm=BankAccounts");
echo "<h1>You must identify yourself</h1>";
echo "<p>Please provide a correct user+password</p>";
}
?>
![Page 15: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/15.jpg)
cs 4408 got here on 14 nov 2005
![Page 16: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/16.jpg)
Accessing this program through a normal browser
• When first called by the browser, no user name or password is provided
• When the WWW-Authenticate header is received by the browser, it asks the user for a username+password
• If he gets it right, he is welcomed
• Otherwise, he is told to that he must identify himself as a user who is entitled to visit the page
![Page 17: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/17.jpg)
A "browser" which provides wrong details for this realm
• At http://cosmos.ucc.ie/~jabowen/cs4408/myBrowser8.php<?php
require_once "HTTP/Request.php";$req = &new HTTP_Request("http://www.cs.ucc.ie/j.bowen/cs4408/resources/securePage.php");
$req->setBasicAuth("peader", "foo");
if (!PEAR::isError($req->sendRequest()))
{echo "<br><strong style='color:red'>Headers</strong>";
$headers = $req->getResponseHeader();
foreach ($headers as $name => $value)
{ echo "<br> $name = $value"; }
echo "<br><strong style='color:red'>Cookies</strong><br>";
$cookies = $req->getResponseCookies();
foreach ($cookies as $fields)
{ foreach ($fields as $name => $value) { echo "$name = $value; "; } echo "<br>"; }
$contents= $req->getResponseBody();
echo "<br><strong style='color:red'>Body</strong><br>";
echo $contents;
}?>
![Page 18: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/18.jpg)
Results of running this "browser"
• Request is rejected because of wrong username and password
![Page 19: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/19.jpg)
A "browser" which provides correct details for this realm
• At http://cosmos.ucc.ie/~jabowen/cs4408/myBrowser9.php<?php
require_once "HTTP/Request.php";$req = &new HTTP_Request("http://www.cs.ucc.ie/j.bowen/cs4408/resources/securePage.php");
$req->setBasicAuth("pedro", "qwerty");
if (!PEAR::isError($req->sendRequest()))
{echo "<br><strong style='color:red'>Headers</strong>";
$headers = $req->getResponseHeader();
foreach ($headers as $name => $value)
{ echo "<br> $name = $value"; }
echo "<br><strong style='color:red'>Cookies</strong><br>";
$cookies = $req->getResponseCookies();
foreach ($cookies as $fields)
{ foreach ($fields as $name => $value) { echo "$name = $value; "; } echo "<br>"; }
$contents= $req->getResponseBody();
echo "<br><strong style='color:red'>Body</strong><br>";
echo $contents;
}?>
![Page 20: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/20.jpg)
Results of running this "browser"
• Request is accepted
![Page 21: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/21.jpg)
User-authentication in PHP (contd.)
• Remember that you cannot mix self-provision of user authentication with external user authentication
• The PHP_AUTH variables will not be set if external authentication is also enabled for a directory which contains a PHP program that is trying to do self-provision of user authentication
– This is to avoid trhe possibility that a script might reveals the password for a page that was protected through a traditional external mechanism, such as the .htaccess mechanism
![Page 22: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/22.jpg)
Using proxies
• HTTP supports both direct and indirect connections between servers and clients
• Indirect connections transmit the request/response messages through one or more proxies
![Page 23: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/23.jpg)
Using proxies (contd.)
• This program, at http://cosmos.ucc.ie/~jabowen/cs4408/myBrowser201.php
uses a direct connection to the RTE server:<?php
require_once "HTTP/Request.php";
$req = & new HTTP_Request('http://www.rte.ie/');
if (!PEAR::isError($req->sendRequest()))
{ $contents= $req->getResponseBody();
echo $contents;}
?>
![Page 24: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/24.jpg)
Output from running this program
![Page 25: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/25.jpg)
Using proxies (contd.)
• This program, at http://cosmos.ucc.ie/~jabowen/cs4408/myBrowser202.php
asks a proxy server to pass its request to the RTE server:
<?php
require_once "HTTP/Request.php";
$req = & new HTTP_Request('http://www.rte.ie/');
$req->setProxy("csproxy.ucc.ie", 80);
if (!PEAR::isError($req->sendRequest()))
{ $contents= $req->getResponseBody();
echo $contents;}
?>
![Page 26: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/26.jpg)
Output from running this program
![Page 27: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/27.jpg)
Uploading files
• Last year, we saw how to write PHP programs which would accept files being uploaded from a browser
• We will review that material before going on to see how we can write our own clients to upload files to servers
![Page 28: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/28.jpg)
File upload form<html><head><title>Upload a File</title></head><body><h1>Upload a File</h1>
<form enctype="multipart/form-data" method="post" action="uploadFile.php">
<p>File to Upload:<input type="file" name=“file1" size="30"></p>
<p><button input type="submit“> "Upload File“</button></p>
</form></body></html>
![Page 29: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/29.jpg)
File upload script<html><head><title>File Upload Report</title></head><body><h1>File Upload Report</h1><p><?phpif ( $file1_name != ‘’ ) { copy("$file1 ", "/full/path/to/your/target/directory/$file1_name") or die(“Could not copy the file! Are directory permissions correct? </p></body></html>");
echo “The following file has been received: “; echo “$file1_name containing $file1_size bytes and of MIME type $file1_type"; } else { die(“You did not specify an input file </p></body></html> "); } ?></p></body></html>
![Page 30: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/30.jpg)
![Page 31: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/31.jpg)
![Page 32: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/32.jpg)
![Page 33: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/33.jpg)
Newer convention
• Newer versions of PHP store all the uploaded file information in the $_FILES autoglobal array.
• $_FILES['userfile']['name'] – The original name of the file on the client machine.
• $_FILES['userfile']['type'] – The mime type of the file, if the browser provided this
information. An example would be `"image/gif"`. • $_FILES['userfile']['size']
– The size, in bytes, of the uploaded file. • $_FILES['userfile']['tmp_name']
– The temporary filename of the file in which the uploaded file was stored on the server.
![Page 34: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/34.jpg)
Part 1 of newer version of program• Program available at:
http://www.cs.ucc.ie/j.bowen/cs4408/resources/fileUploader.php
• It will only work if it has write permission for directory /www/docs/j.bowen/cs4408/resources/upload/
<html>
<head><title>File uploader</title></head>
<body>
<?php
if (!$_POST["uploadingFile"])
{ ?><h1>Upload a File</h1>
<form enctype="multipart/form-data" method="post" action="fileUploader.php">
<p>File to Upload:
<input type="file" name="file1" size="30"></p>
<input type="hidden" name="uploadingFile" value="1">
<p><button input type="submit">Upload File</button></p>
</form>
<?php
}
![Page 35: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/35.jpg)
Part 2 of newer version of program
else {?> <h1>File Upload Report</h1><p>
<?php $file1_name=$_FILES["file1"]["name"];
$file1_type=$_FILES["file1"]["type"];
$file1_size=$_FILES["file1"]["size"];
$file1=$_FILES["file1"]["tmp_name"];
if ( $file1_name != "" ) { $uploadDirectory = '/www/docs/j.bowen/cs4408/resources/upload/';
$destinationFile= $uploadDirectory.$file1_name;
move_uploaded_file($file1, $destinationFile) or die("Could not copy the file! Are directory permissions correct?");
?>The following file has been received: <?php echo $file1_name; ?> containing <?php echo $file1_size; ?>
bytes and of MIME type <?php echo $file1_type; ?><?php
}
else { die("You did not specify an input file </p>"); } ?>
<?php } ?>
</p></body></html>
![Page 36: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/36.jpg)
Program in use with a MSIE browser
![Page 37: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/37.jpg)
Program in use with a MSIE browser
![Page 38: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/38.jpg)
Program in use with a MSIE browser
![Page 39: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/39.jpg)
Program in use with a MSIE browser
![Page 40: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/40.jpg)
Program in use with a MSIE browser
![Page 41: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/41.jpg)
Program in use with a MSIE browser
![Page 42: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/42.jpg)
A client which uploads a file to the same program • Suppose we want to write our own client which will upload a file to
this program:
http://www.cs.ucc.ie/j.bowen/cs4408/resources/fileUploader.php
• Remember that the program fileUploader.php expects to receive data from a form on which there are the following input boxes:
<input type="file" name="file1" size="30">
<input type="hidden" name="uploadingFile" value="1">
• Our client must send a request which contains data that looks as if it comes from these two inputs
• That it, it must send, as POST data, the equationuploadingFile=1
• and it must send a file as it it were sent from a file input called file1
![Page 43: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/43.jpg)
A client which uploads a file to the same program • This client is available here
http://cosmos.ucc.ie/~jabowen/cs4408/myBrowser10.php
• It uploads a file called courses.txt from a sub-directory, called demoDir, of the directory which contains the client program itself
<?php
require_once "HTTP/Request.php";
$req =& new HTTP_Request("http://www.cs.ucc.ie/j.bowen/cs4408/resources/fileUploader.php");
$req->setMethod(HTTP_REQUEST_METHOD_POST);
$req->addPostData("uploadingFile", "1");
$result = $req->addFile("file1", "demoDir/courses.txt");
if (!PEAR::isError($result))
{ $response = $req->sendRequest();
if (!PEAR::isError($response)) { echo $req->getResponseBody(); }
} ?>
![Page 44: A digression The next feature of programming HTTP clients that we will consider is user authentication Before considering that, however, we will digress.](https://reader036.fdocuments.in/reader036/viewer/2022062511/551b92da550346a10a8b5a55/html5/thumbnails/44.jpg)
Result of running this client