当前位置: 首页 > 知识库问答 >
问题:

在Java中使用Office 365 REST API构建守护程序或服务应用程序

窦志新
2023-03-14

我正在尝试构建批处理作业以访问 Office 365 邮件 API。在检查文档(概念非常清楚)时,我找不到为 Java 编写的代码示例。我找到了这个,但它依赖于java pom文件,但如果可能的话,我很想直接使用REST API或Graphi API。

有人能告诉我如何开始构建一个守护程序服务来访问Office 365 REST API而无需用户登录吗?

更新

我有以下代码使用 AADL 库获取令牌

String tenant="....";
        String authority = "https://login.windows.net/"+tenant+"/oauth2/authorize";
        ExecutorService service=null;
        service= Executors.newFixedThreadPool(1);

        try{

            AuthenticationContext authenticationContext= new AuthenticationContext(authority,false,service);
            String certFile="/mycert2.pfx";
            InputStream pkcs12Cert= new SharedFileInputStream(certFile);

            AsymmetricKeyCredential credential=AsymmetricKeyCredential.create("....",pkcs12Cert,"pass");


            Future<AuthenticationResult> future=authenticationContext.acquireToken("https://outlook.office365.com",credential,null);

            System.out.println("Token Received"+future.get().getAccessToken());
            String token = future.get().getAccessToken();

            HttpGet httpGet = new       HttpGet("https://graph.microsoft.com/v1.0/users");

            httpGet.setHeader("Authorization", "Bearer "+token);


            GraphServices graphServices = new GraphServices();
            ResponseEntity<String> responseEntity;


            //responseEntity = graphServices.getEmails(token); //Throws the same Unauthorized exception 

            HttpClient httpClient= HttpClients.createDefault();

            HttpResponse response=httpClient.execute(httpGet);
//response contains Unauthorized access 
            HttpEntity entity=response.getEntity();

        }
        catch (MalformedURLException e){
            e.printStackTrace();

        }
        catch (Exception e){
            e.printStackTrace();
        }


    }

这里是来自http的未授权错误。执行方法

https响应代理{HTTP/1.1 401未授权[内容类型:应用程序/json; charset=utf-8,服务器:Microsoft IIS/8.5,请求ID: 49ca360f-ab4b-42d5-a4b0-9676e4244c21,客户端请求ID: 49ca360f-ab4b-42d5-a4b0-9676e4244c21, x-ms-ags-的诊断:{"ServerInfo":{"DataCenter":"West US","Slice":"SliceA","ScaleUnit":"003","Host":"AGSFE_IN_8","ADSite Name":"WST"}}, X-Powed-By:ASP.NET, Date: Tue,06 Sep 2016 20:43:24 GMT, Content-长度: 244]响应EntityProxy{[内容类型:应用程序/json; charset=utf-8, Content-L长: 244,分块:假]}

eyJ0eXAiOiJKV1QiLCJxcy76FRUlljRV9tb3RXVkpLSHJ3TEJiZF85cyIsImtpZCI6IlliUkFRUlljRV9tb3RXVkpLSHJ3TEJiZF85cyJ9.eyJhdWdfsas32sub2ZmaWNlMzY1LmNvbSIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2YwMjYzMzUzLWFlYjItNGE4YS1iZThhLTc3Mzc3MmE2MGJlMy8iLCJpYXQiOjE0NzMxOTQ4MjIsIm5iZiI6MTQ3MzE5NDgyMiwiZXhwIjoxNDczMTk4NzIyLCJhcHBpZCI6IjhhNjc2ZjJkLWU1M2MtNDViNy05MzhhLTdiOTE1YjVkZTRiNiIsImFwcGlkYWNyIjoiMasdff4577dHMud2luZG93cy5uZXQvZjAyNjMzNTMtYWViMi00YThhLWJlOGEtNzczNzcyYTYwYmUzLyIsIm9pZCI6IjQ3NDhkZDE5LTAxOTUtNDcwOC04MTNkLTQxMTdhNDhlMTdmOCIsInN1YiI6IjQ3NDhkZDE5LTAxOTUtNDcwOC04MTNkLTQxMTdhNDhlMTdmOCIsInRpZCI6ImYwMjYzMzUzLWFlYjItNGE4YS1iZThhLTc3Mzc3MmE2MGJlMyIsInZlciI6IjEuMCJ9.BKt54345DIfv2WWT4pQ--Nuy-0aHkkht4332r7E4d5mP-EAEKmcQe7y0IPjkYGZTNhyNiG2tVAyb56Gcbessdsfewz_BNoAolTVukxttXc-pFY1_Ol5Adc8T5yio43ixfs88mrVRqZEHsb7c-wjO-otBXocZs8waYXdree83g1JtcnULs7bAGp3VBUhMjuJ2u87363Yq3lfse39_Pt6tRw]

(令牌与此类似,只是为了安全起见将其更改为类似的内容)

共有2个答案

扈运浩
2023-03-14

要在守护程序或服务应用程序中进行身份验证,我们可以使用客户端凭据流。注册应用程序后,我们会得到这个秘密。然后,我们可以直接使用下面的请求来获取应用程序专用访问令牌:

POST https://login.microsoftonline.com/<tenantId>/oauth2/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials
&client_id=<clientId>
&client_secret=<clientSecret>
&resource=https://graph.microsoft.com

为了使用Office 365访问令牌,我们可以将资源替换为< code > https://outlook . Office . com 。这是一个关于在服务或守护程序中调用Microsoft Graph的详细文档。

唐修能
2023-03-14

这里的Java演练(尽管对于使用身份验证代码流的web应用程序):https://dev.outlook.com/restapi/tutorial/java

还有这个使用客户端凭据流的示例:

https://github.com/jasonjoh/java-calendar-demo

 类似资料:
  • 有人可以帮助我解决以下问题吗? 场景。我有一个运行在Azure虚拟机上的Windows服务。服务接收文件,以某种方式修改它们(我们假设它给Word文件添加了自定义属性)并使用MIP SDK用template ID保护它们。 问题。失败,但有以下异常: 出现一个或多个错误。ServiceDiscoveryHelper::GetServiceDetails-无法计算域:许可证域、标识和云endpoin

  • 问题内容: 创建可在Linux上使用“服务”运行的Java应用程序的最佳方法是什么?我打算使用此处提供的JSW ,但不能在此上使用许可证(许可证是GPL或据我所知要花钱)。我需要apache样式许可。 我正在使用maven进行构建,因此,如果可以使用maven插件创建服务,那就太好了,但是其他建议也都很棒。 我已经看过Apache Commons Daemon ,是否为此有一个Maven插件?文档

  • 问题内容: 在Ruby中创建行为良好的Unix或Linux守护程序的正确方法是什么? 无论如何,行为良好的守护程序的定义是什么,如何用Ruby编写这样的程序? 问题答案: 根据 UNIX环境 第13章的Stevens 高级编程 ,这是制作行为良好的Unix守护程序的过程: 分叉并有父出口。这使Shell或引导脚本认为命令已完成。此外,保证子进程不会成为进程组负责人(下一个setsid的先决条件)

  • 问题内容: 我正在做Java试卷,并且遇到了以下使我感到困惑的问题。 以下哪项是正确的?(选择所有适用项。) 答:当应用程序开始运行时,会有一个守护线程,其任务是执行main()。 B.当一个应用程序开始运行时,有一个非守护进程线程,其工作是执行main()。 C.由守护程序线程创建的线程最初也是守护程序线程。 D.由非守护程序线程创建的线程最初也是非守护程序线程。 关键答案是B,C,D,谁能告诉

  • 问题内容: 我正在寻找将Java应用程序作为* NIX守护程序或Windows服务运行的最佳方法。我看过Java Service Wrapper ,Apache Commons项目’jsvc’ 和Apache Commons项目’procrun’。到目前为止,Java Service Wrapper似乎是最好的选择……但是,我想知道那里是否还有其他“开源友好”许可产品。 问题答案: 我自己使用Ja

  • 问题内容: 我有一个简单的Python脚本充当守护程序。我试图创建systemd脚本,以便能够在启动过程中启动此脚本。 当前的systemd脚本: node.py: 包含循环。 我尝试使用运行该服务。不幸的是,服务从未完成说明序列-我必须按Ctrl + C。脚本正在运行,但是状态为激活,一段时间后变为停用状态。现在我正在使用(但是在我尝试不使用它之前,症状是相似的)。 我应该为脚本实现一些其他功能