Проблема UrlEncoding при аутентификации против MySpace с использованием DotNetOpenAuth - PullRequest
1 голос
/ 09 марта 2011

Я использую (небольшое отклонение) InMemoryToken Manager, предоставленный примером блока ApplicationBuilding, для аутентификации в MySpace с использованием DotNetOpenAuth.

Как мне кажется, токены, возвращаемые из MySpace после аутентификации, неправильно кодируются при вызове ProcessUserAuthorization.

Чтобы заставить работать токены, которые я использую в настоящее времяследующий уродливый хак, чтобы получить TokenManager, чтобы найти соответствующий секрет.(Хак не нужен для аутентификации в Твиттере)

    public string GetTokenSecret(string token)
    {

        // hack necessary for myspace :(
        token = HttpUtility.UrlDecode(token);
        string tokenSecret = tokensAndSecrets[token];

        ....

    }

Это мой класс MySpaceConsumer

public static class MySpaceConsumer
{
    public static readonly ServiceProviderDescription ServiceDescription = new ServiceProviderDescription
    {
        RequestTokenEndpoint = new MessageReceivingEndpoint("http://api.myspace.com/request_token", HttpDeliveryMethods.GetRequest | HttpDeliveryMethods.AuthorizationHeaderRequest),
        UserAuthorizationEndpoint = new MessageReceivingEndpoint("http://api.myspace.com/authorize", HttpDeliveryMethods.GetRequest | HttpDeliveryMethods.AuthorizationHeaderRequest),
        AccessTokenEndpoint = new MessageReceivingEndpoint("http://api.myspace.com/access_token", HttpDeliveryMethods.GetRequest | HttpDeliveryMethods.AuthorizationHeaderRequest),
        TamperProtectionElements = new ITamperProtectionChannelBindingElement[] { new HmacSha1SigningBindingElement() },
    };

    /// <summary>
    /// The description of Twitter's OAuth protocol URIs for use with their "Sign in with Twitter" feature.
    /// </summary>
    public static readonly ServiceProviderDescription SignInWithTwitterServiceDescription = new ServiceProviderDescription
    {
        RequestTokenEndpoint = new MessageReceivingEndpoint("http://api.myspace.com/request_token", HttpDeliveryMethods.GetRequest | HttpDeliveryMethods.AuthorizationHeaderRequest),
        UserAuthorizationEndpoint = new MessageReceivingEndpoint("http://api.myspace.com/authorize", HttpDeliveryMethods.GetRequest | HttpDeliveryMethods.AuthorizationHeaderRequest),
        AccessTokenEndpoint = new MessageReceivingEndpoint("http://api.myspace.com/access_token", HttpDeliveryMethods.GetRequest | HttpDeliveryMethods.AuthorizationHeaderRequest),
        TamperProtectionElements = new ITamperProtectionChannelBindingElement[] { new HmacSha1SigningBindingElement() },
    };

    static MySpaceConsumer()
    {
        // Twitter can't handle the Expect 100 Continue HTTP header. 
        //ServicePointManager.FindServicePoint(GetFavoritesEndpoint.Location).Expect100Continue = false;
    }

    public static bool IsMySpaceConsumerConfigured
    {
        get
        {
            return !string.IsNullOrEmpty(Busker.MVC.Properties.Settings.Default.TwitterConsumerKey) &&
                !string.IsNullOrEmpty(Busker.MVC.Properties.Settings.Default.TwitterConsumerSecret);
        }
    }


    private static BuskerTokenManager ShortTermUserSessionTokenManager
    {
        get
        {
            var store = HttpContext.Current.Session;
            var tokenManager = (BuskerTokenManager)store["MySpaceShortTermUserSessionTokenManager"];
            if (tokenManager == null)
            {
                string consumerKey = Busker.MVC.Properties.Settings.Default.TwitterConsumerKey;
                string consumerSecret = Busker.MVC.Properties.Settings.Default.TwitterConsumerSecret;
                if (IsMySpaceConsumerConfigured)
                {
                    tokenManager = new BuskerTokenManager(consumerKey, consumerSecret);
                    store["MySpaceShortTermUserSessionTokenManager"] = tokenManager;
                }
                else
                {
                    throw new InvalidOperationException("No Twitter OAuth consumer key and secret could be found in web.config AppSettings.");
                }
            }

            return tokenManager;
        }
    }


    private static readonly MessageReceivingEndpoint GetMyProfile = new MessageReceivingEndpoint("http://api.myspace.com/1.0/people/@me/@self?format=xml", HttpDeliveryMethods.GetRequest);
    public static XDocument GetProfile(ConsumerBase myspace, string accessToken)
    {
        IncomingWebResponse response = myspace.PrepareAuthorizedRequestAndSend(GetMyProfile, accessToken);
        return XDocument.Load(XmlReader.Create(response.GetResponseReader()));
    }

}
...