3434import java .net .http .HttpClient ;
3535import java .net .http .HttpRequest ;
3636import java .net .http .HttpResponse ;
37+ import java .util .Collections ;
3738import java .util .List ;
3839import javax .inject .Singleton ;
3940import org .eclipse .che .api .auth .shared .dto .OAuthToken ;
@@ -55,6 +56,7 @@ public class AzureDevOpsOAuthAuthenticator extends OAuthAuthenticator {
5556 private final String PROVIDER_NAME = "azure-devops" ;
5657 private final String clientId ;
5758 private final String clientSecret ;
59+ private final boolean isDevOpsOauth ;
5860
5961 private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper ();
6062
@@ -66,7 +68,8 @@ public AzureDevOpsOAuthAuthenticator(
6668 String azureDevOpsScmApiEndpoint ,
6769 String authUri ,
6870 String tokenUri ,
69- String [] redirectUris )
71+ String [] redirectUris ,
72+ boolean isDevOpsOauth )
7073 throws IOException {
7174 this .cheApiEndpoint = cheApiEndpoint ;
7275 this .clientId = clientId ;
@@ -78,6 +81,7 @@ public AzureDevOpsOAuthAuthenticator(
7881 trimEnd (azureDevOpsApiEndpoint , '/' ), API_VERSION );
7982 this .tokenUri = tokenUri ;
8083 this .redirectUris = redirectUris ;
84+ this .isDevOpsOauth = isDevOpsOauth ;
8185 configure (
8286 clientId , clientSecret , redirectUris , authUri , tokenUri , new MemoryDataStoreFactory ());
8387 }
@@ -90,8 +94,15 @@ public AzureDevOpsOAuthAuthenticator(
9094 */
9195 @ Override
9296 public String getAuthenticateUrl (URL requestUrl , List <String > scopes ) {
97+ if (isDevOpsOauth ) {
98+ scopes = Collections .singletonList ("vso.code_write" );
99+ }
93100 AuthorizationCodeRequestUrl url = flow .newAuthorizationUrl ().setScopes (scopes );
94- url .set ("response_type" , "code" );
101+ if (isDevOpsOauth ) {
102+ url .set ("response_type" , "Assertion" );
103+ } else {
104+ url .set ("response_type" , "code" );
105+ }
95106 url .set ("redirect_uri" , format ("%s/oauth/callback" , cheApiEndpoint ));
96107 url .setState (prepareState (requestUrl ));
97108 return url .build ();
@@ -204,10 +215,19 @@ protected AuthorizationCodeTokenRequest getAuthorizationCodeTokenRequest(
204215 URL requestUrl , List <String > scopes , String code ) {
205216 AuthorizationCodeTokenRequest request =
206217 super .getAuthorizationCodeTokenRequest (requestUrl , scopes , code );
207- request .set ("client_id" , clientId );
208- request .set ("grant_type" , "authorization_code" );
209- request .set ("client_secret" , URLEncoder .encode (clientSecret ));
210- request .setResponseClass (TokenResponse .class );
218+ if (isDevOpsOauth ) {
219+ request .set ("grant_type" , "urn:ietf:params:oauth:grant-type:jwt-bearer" );
220+ request .set ("assertion" , code );
221+ request .set ("client_assertion" , clientSecret );
222+ request .set (
223+ "client_assertion_type" , "urn:ietf:params:oauth:client-assertion-type:jwt-bearer" );
224+ request .setResponseClass (AzureDevOpsTokenResponse .class );
225+ } else {
226+ request .set ("client_id" , clientId );
227+ request .set ("grant_type" , "authorization_code" );
228+ request .set ("client_secret" , URLEncoder .encode (clientSecret ));
229+ request .setResponseClass (TokenResponse .class );
230+ }
211231 return request ;
212232 }
213233}
0 commit comments