Skip to content

Commit 1cc8866

Browse files
authored
Merge pull request #185 from AzureAD/dev
1.4.0 Release
2 parents 4fbf681 + 102061f commit 1cc8866

File tree

102 files changed

+3063
-1032
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

102 files changed

+3063
-1032
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Quick links:
1616
The library supports the following Java environments:
1717
- Java 8 (or higher)
1818

19-
Current version - 1.3.0
19+
Current version - 1.4.0
2020

2121
You can find the changes for each version in the [change log](https://github.com/AzureAD/microsoft-authentication-library-for-java/blob/master/changelog.txt).
2222

@@ -28,13 +28,13 @@ Find [the latest package in the Maven repository](https://mvnrepository.com/arti
2828
<dependency>
2929
<groupId>com.microsoft.azure</groupId>
3030
<artifactId>msal4j</artifactId>
31-
<version>1.3.0</version>
31+
<version>1.4.0</version>
3232
</dependency>
3333
```
3434
### Gradle
3535

3636
```
37-
compile group: 'com.microsoft.azure', name: 'msal4j', version: '1.3.0'
37+
compile group: 'com.microsoft.azure', name: 'msal4j', version: '1.4.0'
3838
```
3939

4040
## Usage

RELEASES.md

Whitespace-only changes.

bnd.bnd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Export-Package: com.microsoft.aad.msal4j

build/credscan-exclude.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,14 @@
1212
{
1313
"placeholder": "ClientPassword",
1414
"_justification" : "credential used for testing. not associated with any tenant"
15+
},
16+
{
17+
"placeholder": "B2C_CONFIDENTIAL_CLIENT_APP_SECRET",
18+
"_justification" : "Not a credential, just the identifier of the secret exposed by test lab API"
19+
},
20+
{
21+
"placeholder": "MSIDLABB2C-MSAapp-AppSecret",
22+
"_justification" : "Not a credential, just the identifier of the secret exposed by test lab API"
1523
}
1624
]
1725
}

changelog.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
Version 1.4.0
2+
=============
3+
- Added acquire token interactive API, using system default browser
4+
- Added authorization code url builder
5+
- Added OSGi support via bnd-maven-plugin
6+
- Added server-side telemetry support
7+
18
Version 1.3.0
29
=============
310
- Added option to pass in AAD instance discovery data

pom.xml

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<modelVersion>4.0.0</modelVersion>
44
<groupId>com.microsoft.azure</groupId>
55
<artifactId>msal4j</artifactId>
6-
<version>1.3.0</version>
6+
<version>1.4.0</version>
77
<packaging>jar</packaging>
88
<name>msal4j</name>
99
<description>
@@ -162,6 +162,7 @@
162162
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
163163
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
164164
</manifest>
165+
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
165166
</archive>
166167
</configuration>
167168
</plugin>
@@ -249,6 +250,18 @@
249250
</execution>
250251
</executions>
251252
</plugin>
253+
<plugin>
254+
<groupId>biz.aQute.bnd</groupId>
255+
<artifactId>bnd-maven-plugin</artifactId>
256+
<version>4.3.1</version>
257+
<executions>
258+
<execution>
259+
<goals>
260+
<goal>bnd-process</goal>
261+
</goals>
262+
</execution>
263+
</executions>
264+
</plugin>
252265
</plugins>
253266
</build>
254267
</project>
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
package com.microsoft.aad.msal4j;
5+
6+
import labapi.B2CProvider;
7+
import labapi.FederationProvider;
8+
import labapi.User;
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
11+
import org.testng.Assert;
12+
import org.testng.annotations.Test;
13+
14+
import java.net.MalformedURLException;
15+
import java.net.URI;
16+
import java.net.URL;
17+
import java.util.Collections;
18+
19+
public class AcquireTokenInteractiveIT extends SeleniumTest {
20+
21+
private final static Logger LOG = LoggerFactory.getLogger(AuthorizationCodeIT.class);
22+
23+
@Test
24+
public void acquireTokenInteractive_ManagedUser(){
25+
User user = labUserProvider.getDefaultUser();
26+
assertAcquireTokenAAD(user);
27+
}
28+
29+
@Test
30+
public void acquireTokenInteractive_ADFSv2019_OnPrem(){
31+
User user = labUserProvider.getOnPremAdfsUser(FederationProvider.ADFS_2019);
32+
assertAcquireTokenADFS2019(user);
33+
}
34+
35+
@Test
36+
public void acquireTokenInteractive_ADFSv2019_Federated(){
37+
User user = labUserProvider.getFederatedAdfsUser(FederationProvider.ADFS_2019);
38+
assertAcquireTokenAAD(user);
39+
}
40+
41+
@Test
42+
public void acquireTokenInteractive_ADFSv4_Federated(){
43+
User user = labUserProvider.getFederatedAdfsUser(FederationProvider.ADFS_4);
44+
assertAcquireTokenAAD(user);
45+
}
46+
47+
@Test
48+
public void acquireTokenInteractive_ADFSv3_Federated(){
49+
User user = labUserProvider.getFederatedAdfsUser(FederationProvider.ADFS_3);
50+
assertAcquireTokenAAD(user);
51+
}
52+
53+
@Test
54+
public void acquireTokenInteractive_ADFSv2_Federated(){
55+
User user = labUserProvider.getFederatedAdfsUser(FederationProvider.ADFS_2);
56+
assertAcquireTokenAAD(user);
57+
}
58+
59+
@Test
60+
public void acquireTokenWithAuthorizationCode_B2C_Local(){
61+
User user = labUserProvider.getB2cUser(B2CProvider.LOCAL);
62+
assertAcquireTokenB2C(user);
63+
}
64+
65+
private void assertAcquireTokenAAD(User user){
66+
67+
PublicClientApplication pca;
68+
try {
69+
pca = PublicClientApplication.builder(
70+
user.getAppId()).
71+
authority(TestConstants.ORGANIZATIONS_AUTHORITY).
72+
build();
73+
} catch(MalformedURLException ex){
74+
throw new RuntimeException(ex.getMessage());
75+
}
76+
77+
IAuthenticationResult result = acquireTokenInteractive(
78+
user,
79+
pca,
80+
TestConstants.GRAPH_DEFAULT_SCOPE);
81+
82+
Assert.assertNotNull(result);
83+
Assert.assertNotNull(result.accessToken());
84+
Assert.assertNotNull(result.idToken());
85+
Assert.assertEquals(user.getUpn(), result.account().username());
86+
}
87+
88+
private void assertAcquireTokenADFS2019(User user){
89+
PublicClientApplication pca;
90+
try {
91+
pca = PublicClientApplication.builder(
92+
TestConstants.ADFS_APP_ID).
93+
authority(TestConstants.ADFS_AUTHORITY).
94+
build();
95+
} catch(MalformedURLException ex){
96+
throw new RuntimeException(ex.getMessage());
97+
}
98+
99+
IAuthenticationResult result = acquireTokenInteractive(user, pca, TestConstants.ADFS_SCOPE);
100+
101+
Assert.assertNotNull(result);
102+
Assert.assertNotNull(result.accessToken());
103+
Assert.assertNotNull(result.idToken());
104+
Assert.assertEquals(user.getUpn(), result.account().username());
105+
}
106+
107+
private void assertAcquireTokenB2C(User user){
108+
109+
PublicClientApplication pca;
110+
try {
111+
pca = PublicClientApplication.builder(
112+
user.getAppId()).
113+
b2cAuthority(TestConstants.B2C_AUTHORITY_SIGN_IN).
114+
build();
115+
} catch(MalformedURLException ex){
116+
throw new RuntimeException(ex.getMessage());
117+
}
118+
119+
IAuthenticationResult result = acquireTokenInteractive(user, pca, user.getAppId());
120+
Assert.assertNotNull(result);
121+
Assert.assertNotNull(result.accessToken());
122+
Assert.assertNotNull(result.idToken());
123+
}
124+
125+
private IAuthenticationResult acquireTokenInteractive(
126+
User user,
127+
PublicClientApplication pca,
128+
String scope){
129+
130+
IAuthenticationResult result;
131+
try {
132+
URI url = new URI("http://localhost:8080");
133+
134+
SystemBrowserOptions browserOptions =
135+
SystemBrowserOptions
136+
.builder()
137+
.openBrowserAction(new SeleniumOpenBrowserAction(user, pca))
138+
.build();
139+
140+
InteractiveRequestParameters parameters = InteractiveRequestParameters
141+
.builder(url)
142+
.scopes(Collections.singleton(scope))
143+
.systemBrowserOptions(browserOptions)
144+
.build();
145+
146+
result = pca.acquireToken(parameters).get();
147+
148+
} catch(Exception e){
149+
LOG.error("Error acquiring token with authCode: " + e.getMessage());
150+
throw new RuntimeException("Error acquiring token with authCode: " + e.getMessage());
151+
}
152+
return result;
153+
}
154+
155+
class SeleniumOpenBrowserAction implements OpenBrowserAction {
156+
157+
private User user;
158+
private PublicClientApplication pca;
159+
160+
SeleniumOpenBrowserAction(User user, PublicClientApplication pca){
161+
this.user = user;
162+
this.pca = pca;
163+
}
164+
165+
public void openBrowser(URL url){
166+
seleniumDriver.navigate().to(url);
167+
runSeleniumAutomatedLogin(user, pca);
168+
}
169+
}
170+
}

0 commit comments

Comments
 (0)