无法使用Unity和OAuth2.0获取授权代码

时间:2019-02-19 13:26:40

标签: c# unity3d oauth-2.0 azure-active-directory

我正在使用需要连接到使用OAuth2.0的Microsoft Dynamics 365的Unity应用程序。我试图使用UnityWebRequest通过调用来检索访问令牌:

https://login.microsoftonline.com/[TENANT_ID]/oauth2/v2.0/token

使用与此线程类似的内容:

OAuth2 Authentication and Operations in Unity

它可以正常工作,我可以获取和访问令牌,但是,当我尝试使用Bearer令牌使用该服务时,我总是会收到“未经授权的401”。

然后我尝试致电:

https://login.microsoftonline.com/[TENANT_ID]/oauth2/v2.0/authorize

但是,当我这样做时,响应就是Microsoft登录屏幕的实际HTML代码。据我所知,获得身份验证代码需要用户交互吗?但是我已经能够通过在控制台C#应用程序中使用NuGet的Microsoft.IdentityModel.Clients.ActiveDirectory程序包来完成此操作,而无需用户交互,因此必须有正确的方法吗?

非常感谢您的帮助!谢谢!

更新1-我的代码

获取访问令牌

private IEnumerator GetAccessToken(Action<string> result)
{
    Dictionary<string, string> content = new Dictionary<string, string>();
    //Fill key and value
    content.Add("scope", "https://graph.microsoft.com/.default");
    content.Add("grant_type", "client_credentials");
    content.Add("client_id", "xxxxx");
    content.Add("client_secret", "xxxx");

    UnityWebRequest www = UnityWebRequest.Post("https://login.microsoftonline.com/[TENANTID]/oauth2/v2.0/token", content);
    //Send request
    yield return www.Send();

    if (!www.isError)
    {
        string resultContent = www.downloadHandler.text;
        TokenClassName json = JsonUtility.FromJson<TokenClassName>(resultContent);

        //Return result
        result(json.access_token);
    }
    else
    {
        //Return null
        result("");
    }
}

调用API

private IEnumerator GetData(Action<string> result)
{
    Dictionary<string, string> content = new Dictionary<string, string>();
    //Fill key and value
    content.Add("CustomerGroupId", "10");

    UnityWebRequest www = UnityWebRequest.Post("https://[ENVIRONMENT].cloudax.dynamics.com/data/TestEntity", content);

    string token = null;

    yield return GetAccessToken((tokenResult) => { token = tokenResult; });

    result(token);

    www.SetRequestHeader("Authorization", "Bearer " + token);
    www.Send();

    if (!www.isError)
    {
        string resultContent = www.downloadHandler.text;
        // Perform additional operations...
    }
}

1 个答案:

答案 0 :(得分:0)

令牌和API调用的资源不同。在令牌请求中,资源为https://graph.microsoft.com,而不是目标API。您应该为目标API请求令牌。