AWS Cognito TOKEN端点无法将授权代码转换为令牌

时间:2018-04-16 16:05:42

标签: amazon-web-services oauth oauth-2.0 amazon-cognito aws-cognito

我的应用首先使用Cognito LOGIN端点获取授权码。然后它使用TOKEN端点尝试获取令牌(id_token,access_token,refresh_token),但是使用unauthorized_client失败。

我不明白为什么,使用相同的客户端访问LOGIN,并成功返回授权代码。我正在关注TOKEN endpoint

的文档
string clientId = ...
string clientSecret = ...
Uri redirectUri = new Uri("myapp://myhost");
string authorization_code = ... // obtained via HTTP GET on LOGIN endpoint
string accessTokenUrl = "https://<domain>.auth.<region>.amazoncognito.com/oauth2/token";

var queryValues = new Dictionary<string, string> 
{
    { "grant_type", "authorization_code" },
    { "code",  authorization_code },
    { "redirect_uri", redirectUri.AbsoluteUri },
    { "client_id", clientId},
};

using (HttpClient client = new HttpClient())
{ 
    // Authorization Basic header with Base64Encoded (clientId::clientSecret)
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
        "Basic",
Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(
    string.Format("{0}:{1}",
        clientId, 
        clientSecret))));

    // Url Encoded Content
    var content = new FormUrlEncodedContent(queryValues);

    // HTTPS POST
    HttpResponseMessage response = await client.PostAsync(accessTokenUrl, content).ConfigureAwait(false);

    string text = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
    // test = {"error" : "unauthorized_client"}
}

1 个答案:

答案 0 :(得分:1)

问题是双重的:

1- System.Uri.AbsoluteUri在返回的字符串中添加一个尾随/,以便我的redirectUri变为myapp://myhost/而不是myapp://myhost

2- AWS Cognito TOKEN端点不接受redirectURI中的尾随/

解决方案:

我现在调用redirectUri.OriginalUri而不是redirectUri.AbsoluteUri我在其中构建查询以保留redirectUri,就像我构建它时一样。

(我不能真正控制这个,因为在我的情况下Xamarin.Auth.OAuthAuthenticator2代表我调用Uri.AbsoluteUri并转换我给它的redirectUri字符串,所以我要去必须修复Xamarin.Auth)。