blob: 8b725e13a242e987cf1eb9cc89d538865a7c765f [file] [log] [blame]
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +01001<?php
2
3namespace OAuth2\GrantType;
4
5use OAuth2\Storage\Bootstrap;
6use OAuth2\Server;
7use OAuth2\Request\TestRequest;
8use OAuth2\Response;
9use PHPUnit\Framework\TestCase;
10
11class UserCredentialsTest extends TestCase
12{
13 public function testNoUsername()
14 {
15 $server = $this->getTestServer();
16 $request = TestRequest::createPost(array(
17 'grant_type' => 'password', // valid grant type
18 'client_id' => 'Test Client ID', // valid client id
19 'client_secret' => 'TestSecret', // valid client secret
20 'password' => 'testpass', // valid password
21 ));
22 $server->grantAccessToken($request, $response = new Response());
23
24 $this->assertEquals($response->getStatusCode(), 400);
25 $this->assertEquals($response->getParameter('error'), 'invalid_request');
26 $this->assertEquals($response->getParameter('error_description'), 'Missing parameters: "username" and "password" required');
27 }
28
29 public function testNoPassword()
30 {
31 $server = $this->getTestServer();
32 $request = TestRequest::createPost(array(
33 'grant_type' => 'password', // valid grant type
34 'client_id' => 'Test Client ID', // valid client id
35 'client_secret' => 'TestSecret', // valid client secret
36 'username' => 'test-username', // valid username
37 ));
38 $server->grantAccessToken($request, $response = new Response());
39
40 $this->assertEquals($response->getStatusCode(), 400);
41 $this->assertEquals($response->getParameter('error'), 'invalid_request');
42 $this->assertEquals($response->getParameter('error_description'), 'Missing parameters: "username" and "password" required');
43 }
44
45 public function testInvalidUsername()
46 {
47 $server = $this->getTestServer();
48 $request = TestRequest::createPost(array(
49 'grant_type' => 'password', // valid grant type
50 'client_id' => 'Test Client ID', // valid client id
51 'client_secret' => 'TestSecret', // valid client secret
52 'username' => 'fake-username', // valid username
53 'password' => 'testpass', // valid password
54 ));
55 $token = $server->grantAccessToken($request, $response = new Response());
56
57 $this->assertEquals($response->getStatusCode(), 401);
58 $this->assertEquals($response->getParameter('error'), 'invalid_grant');
59 $this->assertEquals($response->getParameter('error_description'), 'Invalid username and password combination');
60 }
61
62 public function testInvalidPassword()
63 {
64 $server = $this->getTestServer();
65 $request = TestRequest::createPost(array(
66 'grant_type' => 'password', // valid grant type
67 'client_id' => 'Test Client ID', // valid client id
68 'client_secret' => 'TestSecret', // valid client secret
69 'username' => 'test-username', // valid username
70 'password' => 'fakepass', // invalid password
71 ));
72 $token = $server->grantAccessToken($request, $response = new Response());
73
74 $this->assertEquals($response->getStatusCode(), 401);
75 $this->assertEquals($response->getParameter('error'), 'invalid_grant');
76 $this->assertEquals($response->getParameter('error_description'), 'Invalid username and password combination');
77 }
78
79 public function testValidCredentials()
80 {
81 $server = $this->getTestServer();
82 $request = TestRequest::createPost(array(
83 'grant_type' => 'password', // valid grant type
84 'client_id' => 'Test Client ID', // valid client id
85 'client_secret' => 'TestSecret', // valid client secret
86 'username' => 'test-username', // valid username
87 'password' => 'testpass', // valid password
88 ));
89 $token = $server->grantAccessToken($request, new Response());
90
91 $this->assertNotNull($token);
92 $this->assertArrayHasKey('access_token', $token);
93 }
94
95 public function testValidCredentialsWithScope()
96 {
97 $server = $this->getTestServer();
98 $request = TestRequest::createPost(array(
99 'grant_type' => 'password', // valid grant type
100 'client_id' => 'Test Client ID', // valid client id
101 'client_secret' => 'TestSecret', // valid client secret
102 'username' => 'test-username', // valid username
103 'password' => 'testpass', // valid password
104 'scope' => 'scope1', // valid scope
105 ));
106 $token = $server->grantAccessToken($request, new Response());
107
108 $this->assertNotNull($token);
109 $this->assertArrayHasKey('access_token', $token);
110 $this->assertArrayHasKey('scope', $token);
111 $this->assertEquals($token['scope'], 'scope1');
112 }
113
114 public function testValidCredentialsInvalidScope()
115 {
116 $server = $this->getTestServer();
117 $request = TestRequest::createPost(array(
118 'grant_type' => 'password', // valid grant type
119 'client_id' => 'Test Client ID', // valid client id
120 'client_secret' => 'TestSecret', // valid client secret
121 'username' => 'test-username', // valid username
122 'password' => 'testpass', // valid password
123 'scope' => 'invalid-scope',
124 ));
125 $token = $server->grantAccessToken($request, $response = new Response());
126
127 $this->assertEquals($response->getStatusCode(), 400);
128 $this->assertEquals($response->getParameter('error'), 'invalid_scope');
129 $this->assertEquals($response->getParameter('error_description'), 'An unsupported scope was requested');
130 }
131
132 public function testNoSecretWithPublicClient()
133 {
134 $server = $this->getTestServer();
135 $request = TestRequest::createPost(array(
136 'grant_type' => 'password', // valid grant type
137 'client_id' => 'Test Client ID Empty Secret', // valid public client
138 'username' => 'test-username', // valid username
139 'password' => 'testpass', // valid password
140 ));
141
142 $token = $server->grantAccessToken($request, $response = new Response());
143
144 $this->assertNotNull($token);
145 $this->assertArrayHasKey('access_token', $token);
146 }
147
148 public function testNoSecretWithConfidentialClient()
149 {
150 $server = $this->getTestServer();
151 $request = TestRequest::createPost(array(
152 'grant_type' => 'password', // valid grant type
153 'client_id' => 'Test Client ID', // valid public client
154 'username' => 'test-username', // valid username
155 'password' => 'testpass', // valid password
156 ));
157
158 $token = $server->grantAccessToken($request, $response = new Response());
159
160 $this->assertEquals($response->getStatusCode(), 400);
161 $this->assertEquals($response->getParameter('error'), 'invalid_client');
162 $this->assertEquals($response->getParameter('error_description'), 'This client is invalid or must authenticate using a client secret');
163 }
164
165 private function getTestServer()
166 {
167 $storage = Bootstrap::getInstance()->getMemoryStorage();
168 $server = new Server($storage);
169 $server->addGrantType(new UserCredentials($storage));
170
171 return $server;
172 }
173}