Oauth 2.0 如何在API管理服务中使用Oauth连接Azure AD认证API

Oauth 2.0 如何在API管理服务中使用Oauth连接Azure AD认证API,oauth-2.0,azure-api-management,Oauth 2.0,Azure Api Management,我有一个API应用程序(比如计算器),我在上面使用门户启用广告认证。我将计算器API添加到API管理服务中。现在我想获取OAuth令牌来调用计算器API。我读了这个 在上面的文章中,它提到,首先获取授权码,然后获取令牌。我已经做了所有的AAD申请,并得到了管理员的同意 在APIM中,我编写了一个策略来获取授权代码 @(“{frontAuthServer}}?客户端id={{clientId}&response类型=代码和重定向{FrontredirectUri}}&response模式=查询和

我有一个API应用程序(比如计算器),我在上面使用门户启用广告认证。我将计算器API添加到API管理服务中。现在我想获取OAuth令牌来调用计算器API。我读了这个

在上面的文章中,它提到,首先获取授权码,然后获取令牌。我已经做了所有的AAD申请,并得到了管理员的同意

在APIM中,我编写了一个策略来获取授权代码


@(“{frontAuthServer}}?客户端id={{clientId}&response类型=代码和重定向{FrontredirectUri}}&response模式=查询和资源={{scope}}”)
得到
应用程序/json
@(新的JObject(新的JProperty(“code”),((IResponse)context.Variables[“code”]).Body.As()).ToString())

但不幸的是,授权代码作为查询参数出现在响应中&我无法使用策略检索它。 所以我只想知道我的方向是否正确,如果是,那么如何从响应中检索查询参数? 或者哪种方法是正确的? 我也是这么做的


但是没有运气。是否需要进行任何设置?我遗漏了什么吗?

如果您的目标是让策略内的oauth流有效地使您的api在没有oauth令牌的情况下可调用,那么您就走上了正确的道路。若auth令牌作为一个查询参数出现,那个么您从服务器得到的应该是302响应和location头。执行以下操作:

<send-request mode="new" response-variable-name="responseObject" timeout="20" ignore-error="true">
    <set-url>@("{{frontAuthServer}}?client_id={{clientId}}&response_type=code&redirect_uri={{FrontredirectUri}}&response_mode=query&resource={{scope}}")</set-url>
    <set-method>GET</set-method>
</send-request>

<set-variable name="token" value="@{
    var location = ((IResponse)responseObject).Headers.GetValueOrDefault("Location");
    if (string.IsNullOrEmpty(location)) {
        return null;
    }

    var tokenStart = location.IndexOf("token=");
    if (tokenStart >= 0) {
        tokenStart += 6;
        var tokenEnd = location.IndexOf("&", tokenStart);
        if (tokenEnd < 0) {
            tokenEnd = location.Length;
        }

        return location.Substring(tokenStart, tokenEnd  - tokenStart);
    }
    return null;
}" />

@(“{frontAuthServer}}?客户端id={{clientId}&response类型=代码和重定向{FrontredirectUri}}&response模式=查询和资源={{scope}}”)
得到

在此之后,令牌应该位于名为“token”的变量中,该变量可以作为上下文在策略表达式中访问。变量[“token”]。

我做了一些更改。我将var location=((IResponse)context.Variables[“responseObject”]).Headers.GetValueOrDefault(“location”);获取位置。它返回null。我没有得到302。总是得到200。使用像Fiddler这样的工具跟踪整个OAuth流将是有益的,这样可以掌握完成了哪些请求、收到了哪些响应以及令牌在哪里。在知道所有这些之后,可以在策略中复制客户端行为以获取令牌。我还看到您指定了response_type=code,这意味着您使用授权码Grant,这意味着您将收到身份验证码作为响应。这还需要对auth端点进行第二次调用,以便为令牌和刷新令牌交换代码。这有点过分,因为我认为您必须需要刷新令牌,所以如果可能的话,我建议您查看intpo隐式流。