From bdabe394b2a194d069dfcd9dde302c069c1c4ed7 Mon Sep 17 00:00:00 2001 From: Alexia Rodriguez Date: Mon, 23 Apr 2018 17:39:36 -0300 Subject: [PATCH 1/5] - Added the possibility to get the email in the Twitter implementation passing queryParameters => ("include_email", "true") to the GetUserInfo function. --- OAuth2/Client/IClient.cs | 2 +- OAuth2/Client/Impl/TwitterClient.cs | 3 ++- OAuth2/Client/OAuth2Client.cs | 4 +++- OAuth2/Client/OAuthClient.cs | 15 ++++++++++++--- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/OAuth2/Client/IClient.cs b/OAuth2/Client/IClient.cs index e4df633..f37f1c8 100644 --- a/OAuth2/Client/IClient.cs +++ b/OAuth2/Client/IClient.cs @@ -44,7 +44,7 @@ public interface IClient /// Callback request payload (parameters). /// Request.QueryString /// - UserInfo GetUserInfo(NameValueCollection parameters); + UserInfo GetUserInfo(NameValueCollection parameters, NameValueCollection queryParameters = null); /// /// Client configuration object. diff --git a/OAuth2/Client/Impl/TwitterClient.cs b/OAuth2/Client/Impl/TwitterClient.cs index cdd2cfb..d7fe4ff 100644 --- a/OAuth2/Client/Impl/TwitterClient.cs +++ b/OAuth2/Client/Impl/TwitterClient.cs @@ -1,3 +1,4 @@ +using System; using Newtonsoft.Json.Linq; using OAuth2.Configuration; using OAuth2.Infrastructure; @@ -109,7 +110,7 @@ protected override UserInfo ParseUserInfo(string content) return new UserInfo { Id = response["id"].Value(), - Email = null, + Email = response["email"] == null ? null : response["email"].Value(), FirstName = firstName, LastName = lastName, AvatarUri = diff --git a/OAuth2/Client/OAuth2Client.cs b/OAuth2/Client/OAuth2Client.cs index 134d47a..6d00207 100644 --- a/OAuth2/Client/OAuth2Client.cs +++ b/OAuth2/Client/OAuth2Client.cs @@ -110,8 +110,10 @@ public virtual string GetLoginLinkUri(string state = null) /// Obtains user information using OAuth2 service and data provided via callback request. /// /// Callback request payload (parameters). - public UserInfo GetUserInfo(NameValueCollection parameters) + /// Callback request payload (query parameters). + public UserInfo GetUserInfo(NameValueCollection parameters, NameValueCollection queryParameters = null) { + queryParameters = queryParameters ?? new NameValueCollection(); GrantType = "authorization_code"; CheckErrorAndSetState(parameters); QueryAccessToken(parameters); diff --git a/OAuth2/Client/OAuthClient.cs b/OAuth2/Client/OAuthClient.cs index 909fe4b..a254366 100644 --- a/OAuth2/Client/OAuthClient.cs +++ b/OAuth2/Client/OAuthClient.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Specialized; +using System.Runtime.InteropServices.ComTypes; using System.Web; using OAuth2.Configuration; using OAuth2.Infrastructure; @@ -78,13 +79,16 @@ public string GetLoginLinkUri(string state = null) /// /// Callback request payload (parameters). /// Request.QueryString + /// Callback request payload for query user info (parameters). + /// Request.QueryString /// - public UserInfo GetUserInfo(NameValueCollection parameters) + public UserInfo GetUserInfo(NameValueCollection parameters, NameValueCollection queryParameters = null) { + queryParameters = queryParameters ?? new NameValueCollection(); AccessToken = parameters.GetOrThrowUnexpectedResponse(OAuthTokenKey); QueryAccessToken(parameters.GetOrThrowUnexpectedResponse("oauth_verifier")); - var result = ParseUserInfo(QueryUserInfo()); + var result = ParseUserInfo(QueryUserInfo(queryParameters)); result.ProviderName = Name; return result; @@ -207,7 +211,7 @@ protected virtual void BeforeGetUserInfo(BeforeAfterRequestArgs args) /// /// Queries user info using corresponding service and data received by access token request. /// - private string QueryUserInfo() + private string QueryUserInfo(NameValueCollection queryParameters) { var client = _factory.CreateClient(UserInfoServiceEndpoint); client.Authenticator = OAuth1Authenticator.ForProtectedResource( @@ -215,6 +219,11 @@ private string QueryUserInfo() var request = _factory.CreateRequest(UserInfoServiceEndpoint); + foreach(var parameter in queryParameters.AllKeys) + { + request.AddParameter(parameter, queryParameters[parameter]); + } + BeforeGetUserInfo(new BeforeAfterRequestArgs { Client = client, From 430c007656de01bd5e6678f10cff6fa9b7d2491f Mon Sep 17 00:00:00 2001 From: Alexia Rodriguez Date: Wed, 2 May 2018 15:55:48 -0300 Subject: [PATCH 2/5] - Added the feature to get the new Facebook image url --- OAuth2/Client/Impl/FacebookClient.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/OAuth2/Client/Impl/FacebookClient.cs b/OAuth2/Client/Impl/FacebookClient.cs index 6697905..45d23f1 100644 --- a/OAuth2/Client/Impl/FacebookClient.cs +++ b/OAuth2/Client/Impl/FacebookClient.cs @@ -71,7 +71,7 @@ protected override Endpoint UserInfoServiceEndpoint /// protected override void BeforeGetUserInfo(BeforeAfterRequestArgs args) { - args.Request.AddParameter("fields", "id,first_name,last_name,email,picture"); + args.Request.AddParameter("fields", "id,first_name,last_name,email,picture.width(256).height(256)"); } /// @@ -81,7 +81,7 @@ protected override void BeforeGetUserInfo(BeforeAfterRequestArgs args) protected override UserInfo ParseUserInfo(string content) { var response = JObject.Parse(content); - const string avatarUriTemplate = "{0}?type={1}"; + const string avatarUriTemplate = "{0}"; var avatarUri = response["picture"]["data"]["url"].Value(); return new UserInfo { @@ -91,9 +91,9 @@ protected override UserInfo ParseUserInfo(string content) Email = response["email"].SafeGet(x => x.Value()), AvatarUri = { - Small = !string.IsNullOrWhiteSpace(avatarUri) ? string.Format(avatarUriTemplate, avatarUri, "small") : string.Empty, - Normal = !string.IsNullOrWhiteSpace(avatarUri) ? string.Format(avatarUriTemplate, avatarUri, "normal") : string.Empty, - Large = !string.IsNullOrWhiteSpace(avatarUri) ? string.Format(avatarUriTemplate, avatarUri, "large") : string.Empty + Small = !string.IsNullOrWhiteSpace(avatarUri) ? string.Format(avatarUriTemplate, avatarUri) : string.Empty, + Normal = !string.IsNullOrWhiteSpace(avatarUri) ? string.Format(avatarUriTemplate, avatarUri) : string.Empty, + Large = !string.IsNullOrWhiteSpace(avatarUri) ? string.Format(avatarUriTemplate, avatarUri) : string.Empty } }; } From 073bfc439d32e6d299a557f8cfff037f621474fa Mon Sep 17 00:00:00 2001 From: Alexia Rodriguez Date: Tue, 8 May 2018 15:48:09 -0300 Subject: [PATCH 3/5] - Added flow to use an existing AccessToken (OAuth2) and AccessToken and AccessTokenSecret(OAuth) to get the user data --- OAuth2/Client/OAuth2Client.cs | 12 +++++++++--- OAuth2/Client/OAuthClient.cs | 12 ++++++++---- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/OAuth2/Client/OAuth2Client.cs b/OAuth2/Client/OAuth2Client.cs index 6d00207..ae80648 100644 --- a/OAuth2/Client/OAuth2Client.cs +++ b/OAuth2/Client/OAuth2Client.cs @@ -41,7 +41,7 @@ public abstract class OAuth2Client : IClient /// /// Access token returned by provider. Can be used for further calls of provider API. /// - public string AccessToken { get; private set; } + public string AccessToken { get; set; } /// /// Refresh token returned by provider. Can be used for further calls of provider API. @@ -116,7 +116,10 @@ public UserInfo GetUserInfo(NameValueCollection parameters, NameValueCollection queryParameters = queryParameters ?? new NameValueCollection(); GrantType = "authorization_code"; CheckErrorAndSetState(parameters); - QueryAccessToken(parameters); + + if(this.AccessToken == null) + QueryAccessToken(parameters); + return GetUserInfo(); } @@ -128,7 +131,10 @@ public string GetToken(NameValueCollection parameters) { GrantType = "authorization_code"; CheckErrorAndSetState(parameters); - QueryAccessToken(parameters); + + if (this.AccessToken == null) + QueryAccessToken(parameters); + return AccessToken; } diff --git a/OAuth2/Client/OAuthClient.cs b/OAuth2/Client/OAuthClient.cs index a254366..6bb115a 100644 --- a/OAuth2/Client/OAuthClient.cs +++ b/OAuth2/Client/OAuthClient.cs @@ -39,12 +39,12 @@ public abstract class OAuthClient : IClient /// /// Access token received from service. Can be used for further service API calls. /// - public string AccessToken { get; private set; } + public string AccessToken { get; set; } /// /// Access token secret received from service. Can be used for further service API calls. /// - public string AccessTokenSecret { get; private set; } + public string AccessTokenSecret { get; set; } /// /// Initializes a new instance of the class. @@ -85,8 +85,12 @@ public string GetLoginLinkUri(string state = null) public UserInfo GetUserInfo(NameValueCollection parameters, NameValueCollection queryParameters = null) { queryParameters = queryParameters ?? new NameValueCollection(); - AccessToken = parameters.GetOrThrowUnexpectedResponse(OAuthTokenKey); - QueryAccessToken(parameters.GetOrThrowUnexpectedResponse("oauth_verifier")); + + if (this.AccessToken == null || this.AccessTokenSecret == null) + { + AccessToken = parameters.GetOrThrowUnexpectedResponse(OAuthTokenKey); + QueryAccessToken(parameters.GetOrThrowUnexpectedResponse("oauth_verifier")); + } var result = ParseUserInfo(QueryUserInfo(queryParameters)); result.ProviderName = Name; From abeca7d88833203c3341d785340e5d8be740aa15 Mon Sep 17 00:00:00 2001 From: Alexia Rodriguez Date: Tue, 8 May 2018 16:06:08 -0300 Subject: [PATCH 4/5] - Fixed a bug in OAuth2 GetUserInfo --- OAuth2/Client/OAuth2Client.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/OAuth2/Client/OAuth2Client.cs b/OAuth2/Client/OAuth2Client.cs index ae80648..7e26cc8 100644 --- a/OAuth2/Client/OAuth2Client.cs +++ b/OAuth2/Client/OAuth2Client.cs @@ -114,12 +114,15 @@ public virtual string GetLoginLinkUri(string state = null) public UserInfo GetUserInfo(NameValueCollection parameters, NameValueCollection queryParameters = null) { queryParameters = queryParameters ?? new NameValueCollection(); - GrantType = "authorization_code"; - CheckErrorAndSetState(parameters); - if(this.AccessToken == null) + if (this.AccessToken == null) + { + GrantType = "authorization_code"; + CheckErrorAndSetState(parameters); + QueryAccessToken(parameters); - + } + return GetUserInfo(); } From ab0646cfd4e549be87da912bfc287c13c8ddcd9c Mon Sep 17 00:00:00 2001 From: Alexia Rodriguez Date: Fri, 11 May 2018 11:43:22 -0300 Subject: [PATCH 5/5] - Implemented large and normal images on Twitter --- .gitignore | 1 + OAuth2/Client/Impl/TwitterClient.cs | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 6f9e0ec..a203027 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ bin obj +.idea *ReSharper* packages *.pyc diff --git a/OAuth2/Client/Impl/TwitterClient.cs b/OAuth2/Client/Impl/TwitterClient.cs index d7fe4ff..230be78 100644 --- a/OAuth2/Client/Impl/TwitterClient.cs +++ b/OAuth2/Client/Impl/TwitterClient.cs @@ -115,9 +115,9 @@ protected override UserInfo ParseUserInfo(string content) LastName = lastName, AvatarUri = { - Small = avatarUri.Replace("normal", "mini"), - Normal = avatarUri, - Large = avatarUri.Replace("normal", "bigger") + Small = avatarUri, + Normal = avatarUri.Replace("normal", "bigger"), + Large = avatarUri.Replace("_normal", "") } }; }