Skip to content

Commit b5374a8

Browse files
committed
Fix for Basic Credentials:
- Client was just adding basic credentials to query string. - Now checks for cotnent type (like signature) and adds where needed. - Changed `SharedSecret` to extend `AbstractCredentials` (and not the silly `Basic` extension). - Made tests a little less repetitive.
1 parent f463717 commit b5374a8

File tree

4 files changed

+141
-129
lines changed

4 files changed

+141
-129
lines changed

src/Client.php

Lines changed: 43 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public function __construct(CredentialsInterface $credentials, $options = array(
6666
$this->setHttpClient($client);
6767

6868
//make sure we know how to use the credentials
69-
if(!($credentials instanceof Basic) AND !($credentials instanceof OAuth)){
69+
if(!($credentials instanceof Basic) && !($credentials instanceof SharedSecret) && !($credentials instanceof OAuth)){
7070
throw new \RuntimeException('unknown credentials type: ' . get_class($credentials));
7171
}
7272

@@ -117,38 +117,21 @@ public function setFactory(FactoryInterface $factory)
117117
return $this;
118118
}
119119

120-
/**
121-
* Get the secret used for request signing.
122-
*
123-
* The client uses it internally to sign outbound requests, but webhooks can be checked
124-
* using the same secret.
125-
*
126-
* @return string
127-
*/
128-
public function getSignatureSecret()
129-
{
130-
if($this->credentials instanceof SharedSecret){
131-
return $this->credentials['shared_secret'];
132-
}
133-
134-
throw new \RuntimeException('can only get signature secret when using `' . SharedSecret::class . '` credentials`');
135-
}
136-
137120
/**
138121
* @param RequestInterface $request
139122
* @param Signature $signature
140123
* @return RequestInterface
141124
*/
142-
public function signRequest(RequestInterface $request)
125+
public static function signRequest(RequestInterface $request, SharedSecret $credentials)
143126
{
144127
switch($request->getHeaderLine('content-type')){
145128
case 'application/json':
146129
$body = $request->getBody();
147130
$body->rewind();
148131
$content = $body->getContents();
149132
$params = json_decode($content, true);
150-
$params['api_key'] = $this->credentials['api_key'];
151-
$signature = new Signature($params, $this->getSignatureSecret());
133+
$params['api_key'] = $credentials['api_key'];
134+
$signature = new Signature($params, $credentials['shared_secret']);
152135
$body->rewind();
153136
$body->write(json_encode($signature->getSignedParams()));
154137
break;
@@ -158,24 +141,57 @@ public function signRequest(RequestInterface $request)
158141
$content = $body->getContents();
159142
$params = [];
160143
parse_str($content, $params);
161-
$params['api_key'] = $this->credentials['api_key'];
162-
$signature = new Signature($params, $this->getSignatureSecret());
144+
$params['api_key'] = $credentials['api_key'];
145+
$signature = new Signature($params, $credentials['shared_secret']);
163146
$params = $signature->getSignedParams();
164147
$body->rewind();
165148
$body->write(http_build_query($params, null, '&'));
166149
break;
167150
default:
168151
$query = [];
169152
parse_str($request->getUri()->getQuery(), $query);
170-
$query['api_key'] = $this->credentials['api_key'];
171-
$signature = new Signature($query, $this->getSignatureSecret());
153+
$query['api_key'] = $credentials['api_key'];
154+
$signature = new Signature($query, $credentials['shared_secret']);
172155
$request = $request->withUri($request->getUri()->withQuery(http_build_query($signature->getSignedParams())));
173156
break;
174157
}
175158

176159
return $request;
177160
}
178161

162+
public static function authRequest(RequestInterface $request, Basic $credentials)
163+
{
164+
switch($request->getHeaderLine('content-type')){
165+
case 'application/json':
166+
$body = $request->getBody();
167+
$body->rewind();
168+
$content = $body->getContents();
169+
$params = json_decode($content, true);
170+
$params = array_merge($params, $credentials->asArray());
171+
$body->rewind();
172+
$body->write(json_encode($params));
173+
break;
174+
case 'application/x-www-form-urlencoded':
175+
$body = $request->getBody();
176+
$body->rewind();
177+
$content = $body->getContents();
178+
$params = [];
179+
parse_str($content, $params);
180+
$params = array_merge($params, $credentials->asArray());
181+
$body->rewind();
182+
$body->write(http_build_query($params, null, '&'));
183+
break;
184+
default:
185+
$query = [];
186+
parse_str($request->getUri()->getQuery(), $query);
187+
$query = array_merge($query, $credentials->asArray());
188+
$request = $request->withUri($request->getUri()->withQuery(http_build_query($query)));
189+
break;
190+
}
191+
192+
return $request;
193+
}
194+
179195
/**
180196
* Wraps the HTTP Client, creates a new PSR-7 request adding authentication, signatures, etc.
181197
*
@@ -186,12 +202,9 @@ public function send(\Psr\Http\Message\RequestInterface $request)
186202
{
187203
//also an instance of Basic, so checked first
188204
if($this->credentials instanceof SharedSecret){
189-
$request = $this->signRequest($request);
205+
$request = self::signRequest($request, $this->credentials);
190206
} elseif($this->credentials instanceof Basic){
191-
$query = [];
192-
parse_str($request->getUri()->getQuery(), $query);
193-
$query = array_merge($query, $this->credentials->asArray());
194-
$request = $request->withUri($request->getUri()->withQuery(http_build_query($query)));
207+
$request = self::authRequest($request, $this->credentials);
195208
}
196209

197210
//todo: add oauth support

src/Client/Credentials/SharedSecret.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
namespace Nexmo\Client\Credentials;
1010

11-
class SharedSecret extends Basic
11+
class SharedSecret extends AbstractCredentials implements CredentialsInterface
1212
{
1313
/**
1414
* Create a credential set with an API key and shared secret.

0 commit comments

Comments
 (0)