Example #1
0
    public ActionResult MailRu(string method)
    {
      try
      {
        if (Session["Mail.Ru:AccessToken"] == null)
        {
          throw new Exception(Test.Resources.Strings.SessionIsDead);
        }

        // get access token from session
        var token = (OAuth2AccessToken)Session["Mail.Ru:AccessToken"];

        // query parameters
        var parameters = new NameValueCollection
        { 
          { "method", method },
          { "app_id", ConfigurationManager.AppSettings["oauth:mail.ru:id"] },
          { "uid" , Session["Mail.Ru:UserId"].ToString() },
          { "secure", "1" },
          { "format", "json" }
        };

        string signatureBaseString = parameters.Sort().ToParametersString();
        parameters["sig"] = OAuthUtility.GetMD5Hash(signatureBaseString + ConfigurationManager.AppSettings["oauth:mail.ru:key"]);

        // execute the request
        var result = OAuthUtility.ExecuteRequest("POST", "http://www.appsmail.ru/platform/api", parameters);

        return Content(result.ToString(), "text/plain");
      }
      catch (Exception ex)
      {
        return Content(ex.ToString(), "text/plain");
      }
    }
    /// <summary>
    /// Gets base string of the signature for current request (OAuth 1.0).
    /// </summary>
    /// <remarks><para>For more details, please visit <see href="http://tools.ietf.org/html/rfc5849#section-3.4.1.1"/></para></remarks>
    public static string GetSignatureBaseString(string httpMethod, Uri url, NameValueCollection parameters, OAuthAuthorization authorization)
    {
      if (String.IsNullOrEmpty(httpMethod)) { throw new ArgumentNullException("httpMethod"); }
      if (authorization == null) { throw new ArgumentNullException("authorization"); }
      if (url == null) { throw new ArgumentNullException("url"); }

      var param = new NameValueCollection();
      if (parameters != null) { param.Add(parameters); }

      // append the authorization headers
      foreach (KeyValuePair<string, UniValue> itm in authorization.Value.CollectionItems)
      {
        if (itm.Key.Equals("oauth_signature", StringComparison.OrdinalIgnoreCase)) { continue; }
        param.Add(itm.Key, itm.Value.ToString());
      }

      // append the query parameters
      string queryString = url.GetComponents(UriComponents.Query, UriFormat.Unescaped);
      if (!String.IsNullOrEmpty(queryString))
      {
        foreach (string q in queryString.Split('&'))
        {
          string[] p = q.Split('=');
          string key = p.First(), value = (p.Length > 1 ? p.Last() : "");
          param.Add(key, value);
        }
      }

      // sorting and build base string of the signature
      StringBuilder signBaseString = new StringBuilder();
      foreach (var itm in param.Sort().ToKeyValuePairCollection())
      {
        //if (itm.Key.Equals("oauth_verifier", StringComparison.OrdinalIgnoreCase)) { continue; }
        if (signBaseString.Length > 0) { signBaseString.Append(OAuthUtility.UrlEncode("&")); }
        signBaseString.Append(OAuthUtility.UrlEncode(String.Format("{0}={1}", itm.Key, OAuthUtility.UrlEncode(itm.Value))));
      }

      signBaseString.Insert(0, String.Format("{0}&{1}&", httpMethod.ToUpper(), OAuthUtility.UrlEncode(url.ToString())));

      return signBaseString.ToString();
    }
    /// <summary>
    /// Gets the user details.
    /// </summary>
    /// <param name="accessToken">May contain an access token, which will have to be used in obtaining information about the user.</param>
    /// <exception cref="ApiException"/>
    public override UserInfo GetUserInfo(AccessToken accessToken = null)
    {
      // http://apiok.ru/wiki/pages/viewpage.action?pageId=46137373#APIДокументация(Русский)-users.getCurrentUser

      accessToken = base.GetSpecifiedTokenOrCurrent(accessToken);

      // query parameters
      var parameters = new NameValueCollection
      { 
        { "method", "users.getCurrentUser" },
        { "application_key", this.ApplicationKey },
        { "format", "json" },
        { "fields", "uid,first_name,last_name,name,gender,birthday,location,pic640x480,email" }
      };

      // signature base string
      // http://apiok.ru/wiki/pages/viewpage.action?pageId=75989046
      string signatureBaseString = parameters.Sort().ToParametersString(true);
      signatureBaseString += OAuthUtility.GetMD5Hash(accessToken.Value + this.ApplicationSecret);

      // calculate the signature
      parameters["sig"] = OAuthUtility.GetMD5Hash(signatureBaseString);
      parameters["access_token"] = accessToken.Value;

      // execute the request
      var result = OAuthUtility.Post("http://api.odnoklassniki.ru/fb.do", parameters);

      // error result
      if (result["error_code"].HasValue)
      {
        throw new ApiException
        (
          result,
          result.ContainsKey("error_msg") ? result["error_msg"].ToString() : null
        );
      }

      // successfully
      // field mapping
      var map = new ApiDataMapping();
      map.Add("uid", "UserId", typeof(string));
      map.Add("first_name", "FirstName");
      map.Add("last_name", "LastName");
      map.Add("name", "DisplayName");
      map.Add("email", "Email");
      map.Add("email", "UserName");
      map.Add("pic640x480", "Userpic");
      map.Add("link", "Url");
      map.Add("birthday", "Birthday", typeof(DateTime), @"yyyy\-MM\-dd");
      map.Add
      (
        "gender", "Sex",
        delegate(UniValue value)
        {
          if (value.Equals("male", StringComparison.OrdinalIgnoreCase))
          {
            return Sex.Male;
          }
          else if (value.Equals("female", StringComparison.OrdinalIgnoreCase))
          {
            return Sex.Female;
          }
          return Sex.None;
        }
      );

      return new UserInfo(result, map);
    }
    /// <summary>
    /// Gets the user details.
    /// </summary>
    /// <param name="accessToken">May contain an access token, which will have to be used in obtaining information about the user.</param>
    /// <returns>
    /// <para>Returns an instance of the <see cref="UserInfo"/> class, containing information about the user.</para>
    /// </returns>
    /// <remarks>
    /// <para>The access token must contain the user ID in the parameter <b>x_mailru_vid</b>.</para>
    /// </remarks>
    /// <exception cref="ApiException"/>
    public override UserInfo GetUserInfo(AccessToken accessToken = null)
    {
      // http://api.mail.ru/docs/reference/rest/users.getInfo/

      accessToken = base.GetSpecifiedTokenOrCurrent(accessToken);

      var parameters = new NameValueCollection
      { 
        { "method", "users.getInfo" },
        { "app_id", this.ApplicationId },
        { "secure", "1" },
        { "uid", accessToken["x_mailru_vid"].ToString() },
        { "format", "json" }
      };

      string signatureBaseString = parameters.Sort().ToParametersString();

      parameters["sig"] = OAuthUtility.GetMD5Hash(signatureBaseString + this.ApplicationSecret);

      var result = OAuthUtility.Post("http://www.appsmail.ru/platform/api", parameters);

      if (!result.IsCollection)
      {
        throw new ApiException(result, "Expected one-dimensional array."); // expected one-dimensional array.
      }

      var map = new ApiDataMapping();
      map.Add("uid", "UserId", typeof(string));
      map.Add("first_name", "FirstName");
      map.Add("last_name", "LastName");
      map.Add("nick", "DisplayName");
      map.Add("email", "Email");
      map.Add("email", "UserName");
      map.Add("pic", "Userpic");
      map.Add("link", "Url");
      map.Add("birthday", "Birthday", typeof(DateTime), @"dd\.MM\.yyyy");
      map.Add
      (
        "sex", "Sex",
        delegate(UniValue value)
        {
          if (Convert.ToInt32(value) == 0)
          {
            return Sex.Male;
          }
          else if (Convert.ToInt32(value) == 1)
          {
            return Sex.Female;
          }
          return Sex.None;
        }
      );

      return new UserInfo(result.First(), map);
    }