本地JAVA开发页面使用AzureAD(AAD)验证登录
我们前一篇文章介绍了本地使用APS.NET开发的WEB服务如何使用AZURE AD(AAD)验证登录,今天我们主要介绍本地使用JAVA开发的WEB服务如何使用AAD验证登录。其实方法跟ASP.NET是一样的,需要在AZURE中注册服务才可以,然后得到对应Client ID 、Security ID、URL等信息。具体见下:
我们首先将代码整理一下,然后使用Eclipse打开即可,需要注意的是,我们建议使用Eclipse打开的时候使用Maven方式,这样打开的话会自动下载对应的jar包。很是方便。
我们选择Import导入即可
我们选择使用Maven
选择项目路径:
导入的过程中会自动下载一些关联的jar包,所以比较慢
该过程会在系统的用户下的m2目录下的repository目录下会下载一些jar包的信息
我们发现目录的信息也会越来越多
项目导入后,我们接下来是配置azure 的应用程序;打开Active Directoty----单击进去AD---应用程序---添加
任意定义一个名称
然后定义登录的URL;该URL是我们java项目的默认访问url
新建完成后,我们可以在配置界面进行查看及修改信息
我们首先要复制客户端id
fdfc7150-2acd-4a98-8f69-b688dfbdc71b
然后接下来要复制秘钥
nQmQMQEbRqaDkdKvRnk99zuOQ23ogLkiIJ73s/7QMgA=
第三我们需要查看token信息
单击查看端点
https://login.chinacloudapi.cn
我们接下来顺便看看用户
我们提前将自定义添加进去了,所以用户的格式是我本地 域的给说
接下来我们还需要记录一个信息
就是azure的登录域信息
接下来我们需要根据需求先修改配置文件 web.xml 打开的方式以txt打开
Authority也需要设置:
国内的为:https://login.chinacloudapi.cn
global: https://windows.net
根据上面的记录信息进行修改
以下信息为国际版本的所需要的登录端点值
https://login.windows.net/
我们测试环境为21世界互联的国内版本azure,所以我们需要修改,修改的格式为我们刚才查看的端点信息,所以要修改以下格式
https://login.chinacloudapi.cn/
接下来就是修改TENANT_NAME了,该值为我们的域名称
修改前
YOUR_TENANT_NAME
修改后
ixmsoft.partner.onm
修改后
最正确的改法应该是:将该值复制对应的id,后面的id都是一样的,所以复制任意一个都可以
8a46539c-3b09-47f5-8d2e-283d79f7e094
所以更改后
接下来修改client_id
修改前:
YOUR_CLIENT_ID
修改后:
fdfc7150-2acd-4a98-8f69-b688dfbdc71b
最后修改Client_securt id
修改前:
YOUR_CLIENT_SECRET
修改后
nQmQMQEbRqaDkdKvRnk99zuOQ23ogLkiIJ73s/7QMgA=
最后记得修改
BasicFilter.java
的配置文件
国际版本使用graph.windows.net,国内版本使用graph.chinacloudapi.cn
https://msdn.microsoft.com/en-us/office/office365/api/o365-china-endpoints?f=255&MSPPError=-2147217396#AzureActiveDirectoryGraphAPI
保存后,我们运行tomcat server
单击secure page
登录提示跳转到error页面
正确的应该是可以去到用户的登录信息,然后返回到index页面
由于之前在程序中 请求地址为global地址,而且在修改自己信息时也存在错误,所以出现了登陆问题。
现在我已经把代码修改好了,您只需要在web.xml文件中修改上自己的信息即可。
而且要是在执行时报证书错误您可以按照如下教程在jdk中导入SSL证书。
1 下载证书:http://www.wosign.com/Root/index.htm#
2.将证书后缀名修改为.cer,并保存到jdk1.8.0_05\jre\lib\security 目录中:
3在cmd 进入到security目录中执行以下命令:
D:\Development_Environment\java\jdk\jre\lib\security keytool -keystore cacerts -importcert -alias cnnicc -file WS_CA1_NEW.cer
4.输入如下密码:changeit
5最后输入yes并导入成功。
然后修改eclipse 中的jre所应用证书的路劲
最后登录测试
http://blchen.com/different-between-china-azure-and-global-azure-for-developers/
国际版本的Azure登录测试
如果是国际版本的话,我们应该选择修改以下内容,通过以下链接进行配置修改
其实说通俗了就是将整个项目中的 chinacloudapi.cn替换成windows.net
Aadcontrolleer.java
Basicfilter.java
Web.xml
------------------------------------------------------------------------------------------------------------------------------
打印显示登陆用户,不显示登陆列表
如果需要打印显示登陆用户的信息,我们需要根据以下信息进行修改
只需要在AadController.java 文件中将 请求graph api 的参数变换一下就可以。
修改方法如下:
修改后为
注意修改以后,会在转化为json 字符串中报错因为获取一个用户信息与获取多个用户信息的返回字符串发生了变化,,到时您只需要根据自己的需要修改即可。
关于使用graph api 的方法您可以参考此地址:https://azure.microsoft.com/en-us/documentation/articles/active-directory-graph-api-quickstart/
修改的为 AadController.java
根据以下格式进行修改,
通过以下代码直接覆盖接口,但是需要区分global和21vnet的api端口
以下代码为 21世纪互联的代码
//add格式的都是添加的 private String getUsernamesFromGraph(String accessToken, String tenant) throws Exception { // URL url = new URL(String.format("https://graph.chinacloudapi.cn/%s/users?api-version=2013-04-05", tenant, URL url = new URL(String.format("https://graph.chinacloudapi.cn/%s/me?api-version=2013-04-05", tenant, accessToken)); //add HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // Set the appropriate header fields in the request header. conn.setRequestProperty("api-version", "2013-04-05"); conn.setRequestProperty("Authorization", accessToken); conn.setRequestProperty("Accept", "application/json;odata=minimalmetadata"); String goodRespStr = HttpClientHelper.getResponseStringFromConn(conn, true); // logger.info("goodRespStr ->" + goodRespStr); int responseCode = conn.getResponseCode(); JSONObject response = HttpClientHelper.processGoodRespStr(responseCode, goodRespStr); JSONObject userJson = new JSONObject();//add userJson = JSONHelper.fetchDirectoryObjectJSONObject(response);//add // JSONArray users = new JSONArray(); // // users = JSONHelper.fetchDirectoryObjectJSONArray(response); StringBuilder builder = new StringBuilder();//add User user = new User();//add JSONHelper.convertJSONObjectToDirectoryObject(userJson, user);//add builder.append(user.getUserPrincipalName() + "
");//add // for (int i = 0; i < users.length(); i++) { // JSONObject thisUserJSONObject = users.optJSONObject(i); // user = new User(); // JSONHelper.convertJSONObjectToDirectoryObject(thisUserJSONObject, user); // builder.append(user.getUserPrincipalName() + "
"); // } return builder.toString(); } }
以下代码为global代码
private String getUsernamesFromGraph(String accessToken, String tenant) throws Exception { // URL url = new URL(String.format("https://graph.windows.net/%s/users?api-version=2013-04-05", tenant, URL url = new URL(String.format("https://graph.windows.net/%s/me?api-version=2013-04-05", tenant, accessToken)); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // Set the appropriate header fields in the request header. conn.setRequestProperty("api-version", "2013-04-05"); conn.setRequestProperty("Authorization", accessToken); conn.setRequestProperty("Accept", "application/json;odata=minimalmetadata"); String goodRespStr = HttpClientHelper.getResponseStringFromConn(conn, true); // logger.info("goodRespStr ->" + goodRespStr); int responseCode = conn.getResponseCode(); JSONObject response = HttpClientHelper.processGoodRespStr(responseCode, goodRespStr); JSONObject userJson = new JSONObject();//add userJson = JSONHelper.fetchDirectoryObjectJSONObject(response);//add // JSONArray users = new JSONArray(); // // users = JSONHelper.fetchDirectoryObjectJSONArray(response); StringBuilder builder = new StringBuilder();//add User user = new User();//add JSONHelper.convertJSONObjectToDirectoryObject(userJson, user);//add builder.append(user.getUserPrincipalName() + "
");//add // for (int i = 0; i < users.length(); i++) { // JSONObject thisUserJSONObject = users.optJSONObject(i); // user = new User(); // JSONHelper.convertJSONObjectToDirectoryObject(thisUserJSONObject, user); // builder.append(user.getUserPrincipalName() + "
"); // } return builder.toString(); } }