【问题标题】:Building Daemon or Service Apps with Office 365 REST API in Java使用 Java 中的 Office 365 REST API 构建守护程序或服务应用程序
【发布时间】:2016-09-07 04:57:04
【问题描述】:

我正在尝试构建批处理作业来访问 Office 365 邮件 API。在检查documentation(概念非常清楚)时,我找不到为Java 编写的代码示例。我找到了this,但它依赖于 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.execute 方法的未经授权的错误

HttpResponseProxy{HTTP/1.1 401 未经授权 [Content-Type: 应用程序/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","ADSiteName":"WST"}}, X-Powered-By:ASP.NET,日期:星期二,2016 年 9 月 6 日 20:43:24 GMT, 内容长度:244] ResponseEntityProxy{[内容类型: 应用程序/json; charset=utf-8,Content-Length: 244,Chunked: false]}}

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

(token是类似的东西,只是为了安全起见改成类似的东西)

【问题讨论】:

    标签: java office365 daemon azure-active-directory outlook-restapi


    【解决方案1】:

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

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

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

    【讨论】:

    • 我认为两者都使用带有登录 UI 的身份验证用户。我们正在构建后台服务,这对我们不起作用,但感谢您的帮助。
    • 您只需要第一次进行身份验证,管理员就可以同意应用程序。在获得初步同意后,您可以跳过该部分。
    • 这意味着,即使是应用程序凭据也不会在没有用户交互的情况下至少提供一次?我的想法是,一旦 Azure 端的设置完成,应用程序就会获得凭据。我从没想过会有来自应用程序的用户交互。
    • 仅当它是多租户方案时。如果您在您的 Office 365 租户中注册该应用程序,则它已经为您的租户“同意”,并且不需要交互。如果您将其设为多租户,那么您需要与其他租户进行用户交互(一次)。
    • 谢谢。我能够使用证书进行身份验证并收到令牌,但我无法使用 Graph Service 获取资源(在这种情况下为电子邮件和联系人)。我会找到解决方法,如果我有问题可能会回到这里。感谢您到目前为止的帮助。顺便说一句,我们确实为我们的企业支付了 Azure 帐户。如果我们直接创建票证,您会为客户提供支持吗?谢谢。
    【解决方案2】:

    要在守护程序或服务应用程序中进行身份验证,我们可以使用 Client Credentials 流程。注册应用程序后,我们将获得 secret。然后我们可以直接使用下面的请求来获取app-only access token:

    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 访问令牌,我们可以将资源替换为 https://outlook.office.comHere 是关于在服务或守护程序应用中调用 Microsoft Graph 的详细文档。

    【讨论】:

    • 我能够获取令牌,但是当我使用 Graph 服务获取电子邮件时,我得到 401(未经授权),即使我已经为应用程序提供了所需的所有权限。
    • 可以通过here解析token,查看token的详细信息。令牌中的 aud 声明是什么?您提出的请求是什么?
    • 我已经更新了引发未经授权异常的代码。任何想法为什么?我没有使用 JWT 假设 future.get().getAccessToken();还给我必须为 Graph API 或 HTTP 请求发送的访问令牌。
    • 仅供参考,您不能将客户端密码用于守护程序服务。您必须使用证书
    • 您为资源 outlook.office365.com 请求令牌的代码,但是您使用的是 Microsoft Graph REST。令牌请求请换成 graph.microsoft.com 看看是否有用。 REST 端点必须使用相应的令牌。
    猜你喜欢
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    相关资源
    最近更新 更多