4
4
namespace Office365 \Runtime \Auth ;
5
5
6
6
use Exception ;
7
+ use Firebase \JWT \JWT ;
7
8
use Office365 \Runtime \Http \HttpMethod ;
8
9
use Office365 \Runtime \Http \RequestOptions ;
9
10
use Office365 \Runtime \Http \Requests ;
@@ -20,6 +21,13 @@ class AADTokenProvider extends BaseTokenProvider
20
21
*/
21
22
private static $ TokenEndpoint = '/oauth2/token ' ;
22
23
24
+
25
+ /**
26
+ * @var string
27
+ */
28
+ private static $ TokenEndpointV2 = '/oauth2/v2.0/token ' ;
29
+
30
+
23
31
/**
24
32
* @var string
25
33
*/
@@ -45,6 +53,10 @@ public function __construct($tenant)
45
53
$ this ->authorityUrl = self ::$ AuthorityUrl . $ tenant ;
46
54
}
47
55
56
+ public function getTokenUrl ($ useV2 ){
57
+ return $ this ->authorityUrl . ($ useV2 ? self ::$ TokenEndpointV2 : self ::$ TokenEndpoint );
58
+ }
59
+
48
60
49
61
/**
50
62
* @param string $resource
@@ -87,6 +99,36 @@ public function acquireTokenForClientCredential($resource, $clientCredentials, $
87
99
}
88
100
89
101
102
+ /**
103
+ * @param CertificateCredentials $credentials
104
+ * @throws Exception
105
+ */
106
+ public function acquireTokenForClientCertificate ($ credentials ){
107
+ $ header = [
108
+ 'x5t ' => base64_encode (hex2bin ($ credentials ->Thumbprint )),
109
+ ];
110
+ $ now = time ();
111
+ $ payload = [
112
+ 'aud ' => $ this ->getTokenUrl (true ),
113
+ 'exp ' => $ now + 360 ,
114
+ 'iat ' => $ now ,
115
+ 'iss ' => $ credentials ->ClientId ,
116
+ 'jti ' => bin2hex (random_bytes (20 )),
117
+ 'nbf ' => $ now ,
118
+ 'sub ' => $ credentials ->ClientId ,
119
+ ];
120
+ $ jwt = JWT ::encode ($ payload , str_replace ('\n ' , "\n" , $ credentials ->PrivateKey ), 'RS256 ' , null , $ header );
121
+
122
+ $ params ['client_assertion_type ' ] = 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer ' ;
123
+ $ params ['client_assertion ' ] = $ jwt ;
124
+ $ params ['grant_type ' ] = "client_credentials " ;
125
+ $ params ['scope ' ] = implode (" " , $ credentials ->Scope );
126
+
127
+ return $ this ->acquireToken ($ params , true );
128
+ }
129
+
130
+
131
+
90
132
/**
91
133
* @param string $resource
92
134
* @param string $clientId
@@ -140,24 +182,26 @@ public function acquireTokenByAuthorizationCode($resource, $clientId, $clientSec
140
182
/**
141
183
* Acquires the access token
142
184
* @param array $parameters
185
+ * @param bool $useV2
143
186
* @return mixed
144
187
* @throws Exception
145
188
*/
146
- public function acquireToken ($ parameters )
189
+ public function acquireToken ($ parameters, $ useV2 = false )
147
190
{
148
- $ request = $ this ->prepareTokenRequest ($ parameters );
191
+ $ request = $ this ->prepareTokenRequest ($ parameters, $ useV2 );
149
192
$ response = Requests::execute ($ request );
150
193
$ response ->validate ();
151
194
return $ this ->normalizeToken ($ response ->getContent ());
152
195
}
153
196
154
197
/**
155
- * @param $parameters
198
+ * @param array $parameters
199
+ * @param bool $useV2
156
200
* @return RequestOptions
157
201
*/
158
- private function prepareTokenRequest ($ parameters )
202
+ private function prepareTokenRequest ($ parameters, $ useV2 )
159
203
{
160
- $ tokenUrl = $ this ->authorityUrl . self :: $ TokenEndpoint ;
204
+ $ tokenUrl = $ this ->getTokenUrl ( $ useV2 ) ;
161
205
$ request = new RequestOptions ($ tokenUrl );
162
206
$ request ->ensureHeader ('content-Type ' , 'application/x-www-form-urlencoded ' );
163
207
$ request ->Method = HttpMethod::Post;
0 commit comments