Sündmused
17. märts, 21 - 21. märts, 10
Liituge sarjaga, et luua muude arendajate ja ekspertidega skaleeritavad tehisintellektilahendused, mis põhinevad reaalajas kasutusjuhtumitel.
Registreeruge koheSeda brauserit enam ei toetata.
Uusimate funktsioonide, turbevärskenduste ja tehnilise toe kasutamiseks võtke kasutusele Microsoft Edge.
This article demonstrates a Java WebLogic app that signs in users and obtains an access token for calling Microsoft Graph. It uses the Microsoft Authentication Library (MSAL) for Java.
The following diagram shows the topology of the app:
The client app uses MSAL for Java (MSAL4J) to sign in a user and obtain an access token for Microsoft Graph from Microsoft Entra ID. The access token proves that the user is authorized to access the Microsoft Graph API endpoint as defined in the scope.
The following sections show you how to set up the sample application.
To clone the sample, open a Bash window and use the following command:
git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 3-java-servlet-web-app/2-Authorization-I/call-graph
Alternatively, navigate to the ms-identity-msal-java-samples repository, then download it as a .zip file and extract it to your hard drive.
Oluline
To avoid file path length limitations on Windows, clone or extract the repository into a directory near the root of your hard drive.
There's one project in this sample. The following sections show you how to register the app using the Azure portal.
To choose your tenant, use the following steps:
Sign in to the Azure portal.
If your account is present in more than one Microsoft Entra ID tenant, select your profile in the corner of the Azure portal, and then select Switch directory to change your session to the desired Microsoft Entra ID tenant.
First, register a new app in the Azure portal by following the instructions in Quickstart: Register an application with the Microsoft identity platform.
Then, use the following steps to complete the registration:
Navigate to the Microsoft identity platform for developers App registrations page.
Select New registration.
In the Register an application page that appears, enter the following application registration information:
In the Name section, enter a meaningful application name for display to users of the app - for example, java-servlet-webapp-call-graph
.
Under Supported account types, select one of the following options:
Select Personal Microsoft accounts for use only by users of personal Microsoft accounts - for example, Hotmail, Live, Skype, and Xbox accounts.
In the Redirect URI section, select Web in the combo-box and enter the following redirect URI: http://localhost:8080/msal4j-servlet-graph/auth/redirect
.
Select Register to create the application.
On the app's registration page, find and copy the Application (client) ID value to use later. You use this value in your app's configuration file or files.
Select Save to save your changes.
On the app's registration page, select Certificates & secrets on the navigation pane to open the page where you can generate secrets and upload certificates.
In the Client secrets section, select New client secret.
Type a description - for example, app secret.
Select one of the available durations: In 1 year, In 2 years, or Never Expires.
Select Add. The generated value is displayed.
Copy and save the generated value for use in later steps. You need this value for your code's configuration files. This value isn't displayed again, and you can't retrieve it by any other means. So, be sure to save it from the Azure portal before you navigate to any other screen or pane.
On the app's registration page, select API permissions from the navigation pane to open the page to add access to the APIs that your application needs.
Select Add permissions.
Ensure that the Microsoft APIs tab is selected.
In the Commonly used Microsoft APIs section, select Microsoft Graph.
In the Delegated permissions section, select User.Read from the list. Use the search box if necessary.
Select Add permissions.
Use the following steps to configure the app:
Märkus
In the following steps, ClientID
is the same as Application ID
or AppId
.
Open the project in your IDE.
Open the ./src/main/resources/authentication.properties file.
Find the string {enter-your-tenant-id-here}
. Replace the existing value with one of the following values:
organizations
if you registered your app with the Accounts in any organizational directory option.common
if you registered your app with the Accounts in any organizational directory and personal Microsoft accounts option.consumers
if you registered your app with the Personal Microsoft accounts option.Find the string {enter-your-client-id-here}
and replace the existing value with the application ID or clientId
of the java-servlet-webapp-call-graph
application copied from the Azure portal.
Find the string {enter-your-client-secret-here}
and replace the existing value with the value you saved during the creation of the java-servlet-webapp-call-graph
app, in the Azure portal.
To build the sample using Maven, navigate to the directory containing the pom.xml file for the sample, and then run the following command:
mvn clean package
This command generates a .war file that you can run on various application servers.
These instructions assume that you installed WebLogic and set up some server domain.
Before you can deploy to WebLogic, use the following steps to make some configuration changes in the sample itself and then build or rebuild the package:
In the sample, find the application.properties or authentication.properties file where you configured the client ID, tenant, redirect URL, and so on.
In this file, change references to localhost:8080
or localhost:8443
to the URL and port that WebLogic runs on, which by default should be localhost:7001
.
You also need to make the same change in the Azure app registration, where you set it in the Azure portal as the Redirect URI value on the Authentication tab.
Use the following steps to deploy the sample to WebLogic via the web console:
Start the WebLogic server with DOMAIN_NAME\bin\startWebLogic.cmd.
Navigate to the WebLogic web console in your browser at http://localhost:7001/console
.
Go to Domain Structure > Deployments, select Install, select Upload your files, and then find the .war file that you built using Maven.
Select Install this deployment as an application, select Next, select Finish, and then select Save.
Most of the default settings should be fine except that you should name the application to match the redirect URI you set in the sample configuration or Azure app registration. That is, if the redirect URI is http://localhost:7001/msal4j-servlet-auth
, then you should name the application msal4j-servlet-auth
.
Go back to Domain Structure > Deployments, and start your application.
After the application starts, navigate to http://localhost:7001/<application-name>/
, and you should be able to access the application.
Use the following steps to explore the sample:
This sample uses MSAL for Java (MSAL4J) to sign a user in and obtain a token for Microsoft Graph API. It uses Microsoft Graph SDK for Java to obtain data from Graph. You must add these libraries to your projects using Maven.
If you want to replicate this sample's behavior, you can copy the pom.xml file and the contents of the helpers and authservlets folders in the src/main/java/com/microsoft/azuresamples/msal4j folder. You also need the authentication.properties file. These classes and files contain generic code that you can use in a wide array of applications. You can copy the rest of the sample as well, but the other classes and files are built specifically to address this sample's objective.
The following table shows the contents of the sample project folder:
File/folder | Description |
---|---|
src/main/java/com/microsoft/azuresamples/msal4j/callgraphwebapp/ | This directory contains the classes that define the app's backend business logic. |
src/main/java/com/microsoft/azuresamples/msal4j/authservlets/ | This directory contains the classes that are used for sign in and sign out endpoints. |
*Servlet.java | All of the endpoints available are defined in Java classes with names ending in Servlet . |
src/main/java/com/microsoft/azuresamples/msal4j/helpers/ | Helper classes for authentication. |
AuthenticationFilter.java | Redirects unauthenticated requests to protected endpoints to a 401 page. |
src/main/resources/authentication.properties | Microsoft Entra ID and program configuration. |
src/main/webapp/ | This directory contains the UI - JSP templates |
CHANGELOG.md | List of changes to the sample. |
CONTRIBUTING.md | Guidelines for contributing to the sample. |
LICENSE | The license for the sample. |
A ConfidentialClientApplication
instance is created in the AuthHelper.java file, as shown in the following example. This object helps craft the Microsoft Entra ID authorization URL and also helps exchange the authentication token for an access token.
// getConfidentialClientInstance method
IClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);
confClientInstance = ConfidentialClientApplication
.builder(CLIENT_ID, secret)
.authority(AUTHORITY)
.build();
The following parameters are used for instantiation:
In this sample, these values are read from the authentication.properties file using a properties reader in the Config.java file.
The following steps provide a walkthrough of the app's functionality:
The first step of the sign-in process is to send a request to the /authorize
endpoint on for your Microsoft Entra ID tenant. The MSAL4J ConfidentialClientApplication
instance is used to construct an authorization request URL. The app redirects the browser to this URL, which is where the user signs in.
final ConfidentialClientApplication client = getConfidentialClientInstance();
AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters.builder(Config.REDIRECT_URI, Collections.singleton(Config.SCOPES))
.responseMode(ResponseMode.QUERY).prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build();
final String authorizeUrl = client.getAuthorizationRequestUrl(parameters).toString();
contextAdapter.redirectUser(authorizeUrl);
The following list describes the features of this code:
AuthorizationRequestUrlParameters
: Parameters that must be set in order to build an AuthorizationRequestUrl
.REDIRECT_URI
: Where Microsoft Entra ID redirects the browser - along with the auth code - after collecting user credentials. It must match the redirect URI in the Microsoft Entra ID app registration in the Azure portalSCOPES
: Scopes are permissions requested by the application.
openid profile offline_access
suffice for receiving an ID token response.User.Read
.The user is presented with a sign-in prompt by Microsoft Entra ID. If the sign-in attempt is successful, the user's browser is redirected to the app's redirect endpoint. A valid request to this endpoint contains an authorization code.
The ConfidentialClientApplication
instance then exchanges this authorization code for an ID token and access token from Microsoft Entra ID.
// First, validate the state, then parse any error codes in response, then extract the authCode. Then:
// build the auth code params:
final AuthorizationCodeParameters authParams = AuthorizationCodeParameters
.builder(authCode, new URI(Config.REDIRECT_URI)).scopes(Collections.singleton(Config.SCOPES)).build();
// Get a client instance and leverage it to acquire the token:
final ConfidentialClientApplication client = AuthHelper.getConfidentialClientInstance();
final IAuthenticationResult result = client.acquireToken(authParams).get();
The following list describes the features of this code:
AuthorizationCodeParameters
: Parameters that must be set in order to exchange the Authorization Code for an ID and/or access token.authCode
: The authorization code that was received at the redirect endpoint.REDIRECT_URI
: The redirect URI used in the previous step must be passed again.SCOPES
: The scopes used in the previous step must be passed again.If acquireToken
is successful, the token claims are extracted. If the nonce check passes, the results are placed in context
- an instance of IdentityContextData
- and saved to the session. The application can then instantiate the IdentityContextData
from the session by way of an instance of IdentityContextAdapterServlet
whenever it needs access to it, as shown in the following code:
// parse IdToken claims from the IAuthenticationResult:
// (the next step - validateNonce - requires parsed claims)
context.setIdTokenClaims(result.idToken());
// if nonce is invalid, stop immediately! this could be a token replay!
// if validation fails, throws exception and cancels auth:
validateNonce(context);
// set user to authenticated:
context.setAuthResult(result, client.tokenCache().serialize());
For information about how the sample app filters access to routes, see AuthenticationFilter.java. In the authentication.properties file, the app.protect.authenticated
property contains the comma-separated routes that only authenticated users can access, as shown in the following example:
# for example, /token_details requires any user to be signed in and does not require special roles or groups claim(s)
app.protect.authenticated=/token_details, /call_graph
When the user navigates to /call_graph
, the application creates an instance of the IGraphServiceClient
- from the Java Graph SDK - passing along the signed-in user's access token. The Graph client places the access token in the Authorization
headers of its requests. The app then asks the Graph client to call the /me
endpoint to yield details for the currently signed-in user.
If you already have a valid access token for Graph Service with the User.Read
scope, you only need the following code to get access to the /me
endpoint:
//CallGraphServlet.java
User user = GraphHelper.getGraphClient(contextAdapter).me().buildRequest().get();
Scopes tell Microsoft Entra ID the level of access that the application is requesting.
Based on the requested scopes, Microsoft Entra ID presents a consent dialogue to the user upon sign-in. If the user consents to one or more scopes and obtains a token, the scopes-consented-to are encoded into the resulting access_token
.
For the scopes requested by the application, see authentication.properties. By default, the application sets the scopes value to User.Read
. This particular Microsoft Graph API scope is for accessing the information of the current signed-in user. The graph endpoint for accessing this info is https://graph.microsoft.com/v1.0/me
. Any valid requests made to this endpoint must bear an access_token
that contains the scope User.Read
in the Authorization
header.
Deploy Java WebLogic apps to WebLogic on Azure Virtual Machines
Sündmused
17. märts, 21 - 21. märts, 10
Liituge sarjaga, et luua muude arendajate ja ekspertidega skaleeritavad tehisintellektilahendused, mis põhinevad reaalajas kasutusjuhtumitel.
Registreeruge koheKoolitus
Moodul
Sign in users with Microsoft Entra ID in a Java web app - Training
Learn how to authenticate users with Microsoft Entra ID and get authorized access to data in a Java web app using Microsoft Authentication Library.
Sertimine
Microsoft Certified: Identity and Access Administrator Associate - Certifications
Demonstrate the features of Microsoft Entra ID to modernize identity solutions, implement hybrid solutions, and implement identity governance.