/**
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for
* license information.
*/
package com.microsoft.azure.management.appservice.samples;
import com.microsoft.azure.management.Azure;
import com.microsoft.azure.management.appservice.AppServicePlan;
import com.microsoft.azure.management.appservice.BuiltInAuthenticationProvider;
import com.microsoft.azure.management.appservice.JavaVersion;
import com.microsoft.azure.management.appservice.PricingTier;
import com.microsoft.azure.management.appservice.WebApp;
import com.microsoft.azure.management.appservice.WebContainer;
import com.microsoft.azure.management.resources.fluentcore.arm.Region;
import com.microsoft.azure.management.resources.fluentcore.utils.SdkContext;
import com.microsoft.azure.management.samples.Utils;
import com.microsoft.rest.LogLevel;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import java.io.Console;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
/**
* Azure App Service sample for managing authentication for web apps.
* - Create 4 web apps under the same new app service plan with:
* - Active Directory login for 1
* - Facebook login for 2
* - Google login for 3
* - Microsoft login for 4
*/
public final class ManageWebAppWithAuthentication {
private static OkHttpClient httpClient;
/**
* Main function which runs the actual sample.
* @param azure instance of the azure client
* @return true if sample runs successfully
*/
public static boolean runSample(Azure azure) {
// New resources
final String suffix = ".azurewebsites.net";
final String app1Name = SdkContext.randomResourceName("webapp1-", 20);
final String app2Name = SdkContext.randomResourceName("webapp2-", 20);
final String app3Name = SdkContext.randomResourceName("webapp3-", 20);
final String app4Name = SdkContext.randomResourceName("webapp4-", 20);
final String app1Url = app1Name + suffix;
final String app2Url = app2Name + suffix;
final String app3Url = app3Name + suffix;
final String app4Url = app4Name + suffix;
final String rgName = SdkContext.randomResourceName("rg1NEMV_", 24);
try {
//============================================================
// Create a web app with a new app service plan
System.out.println("Creating web app " + app1Name + " in resource group " + rgName + "...");
WebApp app1 = azure.webApps().define(app1Name)
.withRegion(Region.US_WEST)
.withNewResourceGroup(rgName)
.withNewWindowsPlan(PricingTier.STANDARD_S1)
.withJavaVersion(JavaVersion.JAVA_8_NEWEST)
.withWebContainer(WebContainer.TOMCAT_8_0_NEWEST)
.create();
System.out.println("Created web app " + app1.name());
Utils.print(app1);
//============================================================
// Set up active directory authentication
System.out.println("Please create an AD application with redirect URL " + app1Url);
System.out.print("Application ID is:");
Console console = System.console();
String applicationId = console.readLine();
System.out.print("Tenant ID is:");
String tenantId = console.readLine();
System.out.println("Updating web app " + app1Name + " to use active directory login...");
app1.update()
.defineAuthentication()
.withDefaultAuthenticationProvider(BuiltInAuthenticationProvider.AZURE_ACTIVE_DIRECTORY)
.withActiveDirectory(applicationId, "https://sts.windows.net/" + tenantId)
.attach()
.apply();
System.out.println("Added active directory login to " + app1.name());
Utils.print(app1);
//============================================================
// Create a second web app
System.out.println("Creating another web app " + app2Name + " in resource group " + rgName + "...");
AppServicePlan plan = azure.appServices().appServicePlans().getById(app1.appServicePlanId());
WebApp app2 = azure.webApps().define(app2Name)
.withExistingWindowsPlan(plan)
.withExistingResourceGroup(rgName)
.withJavaVersion(JavaVersion.JAVA_8_NEWEST)
.withWebContainer(WebContainer.TOMCAT_8_0_NEWEST)
.create();
System.out.println("Created web app " + app2.name());
Utils.print(app2);
//============================================================
// Set up Facebook authentication
System.out.println("Please create a Facebook developer application with whitelisted URL " + app2Url);
System.out.print("App ID is:");
String fbAppId = console.readLine();
System.out.print("App secret is:");
String fbAppSecret = console.readLine();
System.out.println("Updating web app " + app2Name + " to use Facebook login...");
app2.update()
.defineAuthentication()
.withDefaultAuthenticationProvider(BuiltInAuthenticationProvider.FACEBOOK)
.withFacebook(fbAppId, fbAppSecret)
.attach()
.apply();
System.out.println("Added Facebook login to " + app2.name());
Utils.print(app2);
//============================================================
// Create a 3rd web app with a public GitHub repo in Azure-Samples
System.out.println("Creating another web app " + app3Name + "...");
WebApp app3 = azure.webApps().define(app3Name)
.withExistingWindowsPlan(plan)
.withNewResourceGroup(rgName)
.defineSourceControl()
.withPublicGitRepository("https://github.com/Azure-Samples/app-service-web-dotnet-get-started")
.withBranch("master")
.attach()
.create();
System.out.println("Created web app " + app3.name());
Utils.print(app3);
//============================================================
// Set up Google authentication
System.out.println("Please create a Google developer application with redirect URL " + app3Url);
System.out.print("Client ID is:");
String gClientId = console.readLine();
System.out.print("Client secret is:");
String gClientSecret = console.readLine();
System.out.println("Updating web app " + app3Name + " to use Google login...");
app3.update()
.defineAuthentication()
.withDefaultAuthenticationProvider(BuiltInAuthenticationProvider.GOOGLE)
.withGoogle(gClientId, gClientSecret)
.attach()
.apply();
System.out.println("Added Google login to " + app3.name());
Utils.print(app3);
//============================================================
// Create a 4th web app
System.out.println("Creating another web app " + app4Name + "...");
WebApp app4 = azure.webApps()
.define(app4Name)
.withExistingWindowsPlan(plan)
.withExistingResourceGroup(rgName)
.create();
System.out.println("Created web app " + app4.name());
Utils.print(app4);
//============================================================
// Set up Google authentication
System.out.println("Please create a Microsoft developer application with redirect URL " + app4Url);
System.out.print("Client ID is:");
String clientId = console.readLine();
System.out.print("Client secret is:");
String clientSecret = console.readLine();
System.out.println("Updating web app " + app3Name + " to use Microsoft login...");
app4.update()
.defineAuthentication()
.withDefaultAuthenticationProvider(BuiltInAuthenticationProvider.MICROSOFT_ACCOUNT)
.withMicrosoft(clientId, clientSecret)
.attach()
.apply();
System.out.println("Added Microsoft login to " + app4.name());
Utils.print(app4);
return true;
} catch (Exception e) {
System.err.println(e.getMessage());
e.printStackTrace();
} finally {
try {
System.out.println("Deleting Resource Group: " + rgName);
azure.resourceGroups().beginDeleteByName(rgName);
System.out.println("Deleted Resource Group: " + rgName);
} catch (NullPointerException npe) {
System.out.println("Did not create any resources in Azure. No clean up is necessary");
} catch (Exception g) {
g.printStackTrace();
}
}
return false;
}
/**
* Main entry point.
* @param args the parameters
*/
public static void main(String[] args) {
try {
//=============================================================
// Authenticate
final File credFile = new File(System.getenv("AZURE_AUTH_LOCATION"));
Azure azure = Azure
.configure()
.withLogLevel(LogLevel.BASIC)
.authenticate(credFile)
.withDefaultSubscription();
// Print selected subscription
System.out.println("Selected subscription: " + azure.subscriptionId());
runSample(azure);
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
private static String curl(String url) {
Request request = new Request.Builder().url(url).get().build();
try {
return httpClient.newCall(request).execute().body().string();
} catch (IOException e) {
return null;
}
}
static {
httpClient = new OkHttpClient.Builder().readTimeout(1, TimeUnit.MINUTES).build();
}
}