Business Central 获取令牌SharePoint

问题描述 投票:0回答:2

我正在尝试将业务中心与共享点连接起来,我已经在邮递员中完成了,它工作得很好,GET 和 POST。 但现在我尝试在 BC 上执行此操作,令牌已创建但无法正常工作,我认为连接或 URL 存在一些问题。

codeunit 50100 "APISharePoint"
{

    var
        OAuth2: Codeunit OAuth2;
        ClientIdTxt: Label '4d148348-137a-40e7-b20c-a458c2a03c65', Locked = true;
        ClientSecret: Label 'Ai2pOhE7yeZ8WRxrwSrHdpVtNqJg51tg2X+s8CJDLy4=', Locked = true;
        ResourceUrlTxt: Label 'https://crmbc384959.sharepoint.com', Locked = true;
        OAuthAuthorityUrlTxt: Label 'https://login.microsoftonline.com/ec36749a-af47-4f04-892c-98666b6cac1b/oauth2/v2.0/token', Locked = true;


    procedure GetAccessToken(): Text
    var
        PromptInteraction: Enum "Prompt Interaction";
        AccessToken: Text;
        AuthCodeError: Text;
        RedirectURLTxt: Text;
    begin
        // OAuth2.GetDefaultRedirectURL(RedirectURLTxt);
        RedirectURLTxt := 'https://localhost';
        if OAuth2.AcquireTokenWithClientCredentials(ClientIdTxt, ClientSecret, OAuthAuthorityUrlTxt, RedirectURLTxt, ResourceURLTxt, AccessToken) then
            exit(AccessToken)
        else
            exit('');
    end;


    procedure HttpGet(AccessToken: Text; Url: Text /*var JResponse: JsonObject*/): Boolean
    var
        Client: HttpClient;
        Headers: HttpHeaders;
        RequestMessage: HttpRequestMessage;
        ResponseMessage: HttpResponseMessage;
        RequestContent: HttpContent;
        ResponseText: Text;
        IsSucces: Boolean;

    begin
        Headers := Client.DefaultRequestHeaders();
        Headers.Add('Authorization', StrSubstNo('Bearer %1', AccessToken));
        Headers.Add('Accept', 'application/json;odata=verbose');
        RequestMessage.Content.GetHeaders(Headers); //asd
        Headers.Remove('Content-Type');
        Headers.Add('Content-Type', 'application/json;odata=verbose');
        RequestMessage.SetRequestUri(Url);
        RequestMessage.Method := 'GET';

        if Client.Send(RequestMessage, ResponseMessage) then
            if ResponseMessage.IsSuccessStatusCode() then begin
                if ResponseMessage.Content.ReadAs(ResponseText) then
                    IsSucces := true;
                //     end else
                //         ResponseMessage.Content.ReadAs(ResponseText);

                // JResponse.ReadFrom(ResponseText);
                exit(IsSucces);

            end;

    end;
sharepoint postman dynamics-business-central dynamics-al
2个回答
0
投票

也许您的问题是 GET 与请求内容的组合。 据我所知,.NET 中 HttpClient 的底层实现不支持带有请求内容的 GET。您可以在这里阅读更多相关信息:如何使用 HttpClient 在 GET 请求正文中发送内容?

也许您可以尝试 GET,而不在内容上设置内容类型,或者改用 POST 或 PUT。

但是您没有提供错误消息,所以这只是一个猜测。


0
投票

这肯定太晚了,我希望你已经找到了解决方案:)。 如果不是,某些 SharePoint 范围不接受仅使用客户端和密码的应用程序注册(Project Online 就是这种情况)。 您需要通过 SSL 证书进行令牌请求。 创建和设置证书的过程如下: https://anupamchand.medium.com/azure-active-directory-authentication-using-client-certificates-4274932a5061 以下代码将为您提供一个可用的令牌:

过程 AcquireTokenOAuth2(var AuthError: text) AccessToken: Text 变量 客户端:HttpClient; 请求消息:HttpRequestMessage; 内容:HttpContent; 标头:HttpHeaders; 响应消息:HttpResponseMessage; Uri:文本; 请求正文:文本; 响应正文:文本; OAuthClientId:文本; OAuthClientSecret:文本; Json:JsonObject; 开始 Uri := 'https://login.microsoftonline.com//oauth2/v2.0/token'; RequestMessage.Method('POST'); RequestMessage.SetRequestUri(Uri); RequestBody := 'scope=https://.sharepoint.com/.default&client_id=&client_assertion_type=urn:ietf:params:oauth:client-assertion- 类型:jwt-bearer&client_assertion=

    Client.Post(Uri, Content, ResponseMessage);
    Content := ResponseMessage.Content();
    Content.ReadAs(ResponseBody);
    if not ResponseMessage.IsSuccessStatusCode() then begin
        AuthError := ResponseBody;
        exit;
    end;

    Json.ReadFrom(ResponseBody);
    AccessToken := GetTextValueForKeyInJson(Json, 'access_token');
end;

IN 邮递员 enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.