summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Arnott <andrewarnott@gmail.com>2008-09-21 12:51:12 -0700
committerAndrew <andrewarnott@gmail.com>2008-09-21 12:51:12 -0700
commit59295037cd02c6fb995db248e0a6fc5bed125daf (patch)
tree628aa3e1d82714ec2ea9181f21c6de840214a203
parent76c4a164c8af4b5239834934bfa8915a60678ed5 (diff)
downloadDotNetOpenAuth-59295037cd02c6fb995db248e0a6fc5bed125daf.zip
DotNetOpenAuth-59295037cd02c6fb995db248e0a6fc5bed125daf.tar.gz
DotNetOpenAuth-59295037cd02c6fb995db248e0a6fc5bed125daf.tar.bz2
Added the 7 OAuth message types.
-rw-r--r--doc/specs/Message parts.xlsxbin0 -> 10163 bytes
-rw-r--r--src/DotNetOAuth/DotNetOAuth.csproj9
-rw-r--r--src/DotNetOAuth/Messages/AccessProtectedResourcesMessage.cs54
-rw-r--r--src/DotNetOAuth/Messages/DirectUserToConsumerMessage.cs39
-rw-r--r--src/DotNetOAuth/Messages/DirectUserToServiceProviderMessage.cs44
-rw-r--r--src/DotNetOAuth/Messages/GrantAccessTokenMessage.cs29
-rw-r--r--src/DotNetOAuth/Messages/IOAuthProtocolDirectedMessage.cs19
-rw-r--r--src/DotNetOAuth/Messages/MessageBase.cs41
-rw-r--r--src/DotNetOAuth/Messages/RequestAccessTokenMessage.cs53
-rw-r--r--src/DotNetOAuth/Messages/RequestTokenMessage.cs52
-rw-r--r--src/DotNetOAuth/Messages/UnauthorizedRequestTokenMessage.cs29
-rw-r--r--src/DotNetOAuth/OAuthMessageTypeProvider.cs68
-rw-r--r--src/DotNetOAuth/ServiceProvider.cs8
13 files changed, 441 insertions, 4 deletions
diff --git a/doc/specs/Message parts.xlsx b/doc/specs/Message parts.xlsx
new file mode 100644
index 0000000..fd917f2
--- /dev/null
+++ b/doc/specs/Message parts.xlsx
Binary files differ
diff --git a/src/DotNetOAuth/DotNetOAuth.csproj b/src/DotNetOAuth/DotNetOAuth.csproj
index 65e074a..7d7c1a6 100644
--- a/src/DotNetOAuth/DotNetOAuth.csproj
+++ b/src/DotNetOAuth/DotNetOAuth.csproj
@@ -68,6 +68,8 @@
<ItemGroup>
<Compile Include="Consumer.cs" />
<Compile Include="IWebRequestHandler.cs" />
+ <Compile Include="Messages\MessageBase.cs" />
+ <Compile Include="Messages\RequestAccessTokenMessage.cs" />
<Compile Include="Messaging\MessagePartAttribute.cs" />
<Compile Include="Messaging\MessageProtection.cs" />
<Compile Include="Messaging\IChannelBindingElement.cs" />
@@ -76,6 +78,12 @@
<Compile Include="Messaging\Bindings\InvalidSignatureException.cs" />
<Compile Include="Messaging\Bindings\IReplayProtectedProtocolMessage.cs" />
<Compile Include="Messaging\Bindings\IExpiringProtocolMessage.cs" />
+ <Compile Include="Messages\AccessProtectedResourcesMessage.cs" />
+ <Compile Include="Messages\GrantAccessTokenMessage.cs" />
+ <Compile Include="Messages\IOAuthProtocolDirectedMessage.cs" />
+ <Compile Include="Messages\DirectUserToConsumerMessage.cs" />
+ <Compile Include="Messages\DirectUserToServiceProviderMessage.cs" />
+ <Compile Include="Messages\UnauthorizedRequestTokenMessage.cs" />
<Compile Include="Messaging\Channel.cs" />
<Compile Include="Messaging\HttpRequestInfo.cs" />
<Compile Include="Messaging\IDirectedProtocolMessage.cs" />
@@ -107,6 +115,7 @@
<Compile Include="OAuthMessageTypeProvider.cs" />
<Compile Include="Messaging\ProtocolException.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="Messages\RequestTokenMessage.cs" />
<Compile Include="StandardWebRequestHandler.cs" />
<Compile Include="Util.cs" />
<Compile Include="Protocol.cs" />
diff --git a/src/DotNetOAuth/Messages/AccessProtectedResourcesMessage.cs b/src/DotNetOAuth/Messages/AccessProtectedResourcesMessage.cs
new file mode 100644
index 0000000..7c0d2e3
--- /dev/null
+++ b/src/DotNetOAuth/Messages/AccessProtectedResourcesMessage.cs
@@ -0,0 +1,54 @@
+//-----------------------------------------------------------------------
+// <copyright file="AccessProtectedResourcesMessage.cs" company="Andrew Arnott">
+// Copyright (c) Andrew Arnott. All rights reserved.
+// </copyright>
+//-----------------------------------------------------------------------
+
+namespace DotNetOAuth.Messages {
+ using System;
+ using System.Runtime.Serialization;
+ using DotNetOAuth.Messaging;
+
+ internal class AccessProtectedResourcesMessage : MessageBase, IDirectedProtocolMessage {
+ private Uri serviceProvider;
+
+ internal AccessProtectedResourcesMessage(Uri serviceProvider) {
+ if (serviceProvider == null) {
+ throw new ArgumentNullException("serviceProvider");
+ }
+
+ this.serviceProvider = serviceProvider;
+ }
+
+ [MessagePart(Name = "oauth_consumer_key", IsRequired = true)]
+ public string ConsumerKey { get; set; }
+ [MessagePart(Name = "oauth_token", IsRequired = true)]
+ public string AccessToken { get; set; }
+ [MessagePart(Name = "oauth_signature_method", IsRequired = true)]
+ public string SignatureMethod { get; set; }
+ [MessagePart(Name = "oauth_signature", IsRequired = true)]
+ public string Signature { get; set; }
+ [MessagePart(Name = "oauth_timestamp", IsRequired = true)]
+ public Uri Timestamp { get; set; }
+ [MessagePart(Name = "oauth_nonce", IsRequired = true)]
+ public Uri Nonce { get; set; }
+ [MessagePart(Name = "oauth_version", IsRequired = false)]
+ public Uri Version { get; set; }
+
+ protected override MessageTransport Transport {
+ get { return MessageTransport.Direct; }
+ }
+
+ protected override MessageProtection RequiredProtection {
+ get { return MessageProtection.All; }
+ }
+
+ #region IDirectedProtocolMessage Members
+
+ Uri IDirectedProtocolMessage.Recipient {
+ get { return this.serviceProvider; }
+ }
+
+ #endregion
+ }
+}
diff --git a/src/DotNetOAuth/Messages/DirectUserToConsumerMessage.cs b/src/DotNetOAuth/Messages/DirectUserToConsumerMessage.cs
new file mode 100644
index 0000000..1f4cdcd
--- /dev/null
+++ b/src/DotNetOAuth/Messages/DirectUserToConsumerMessage.cs
@@ -0,0 +1,39 @@
+//-----------------------------------------------------------------------
+// <copyright file="DirectUserToConsumerMessage.cs" company="Andrew Arnott">
+// Copyright (c) Andrew Arnott. All rights reserved.
+// </copyright>
+//-----------------------------------------------------------------------
+
+namespace DotNetOAuth.Messages {
+ using System;
+ using System.Runtime.Serialization;
+ using DotNetOAuth.Messaging;
+
+ internal class DirectUserToConsumerMessage : MessageBase, IDirectedProtocolMessage {
+ private Uri consumer;
+
+ internal DirectUserToConsumerMessage(Uri consumer) {
+ this.consumer = consumer;
+ }
+
+ // TODO: graph in spec says this is optional, but in text is suggests it is required.
+ [MessagePart(Name = "oauth_token", IsRequired = true)]
+ public string RequestToken { get; set; }
+
+ protected override MessageTransport Transport {
+ get { return MessageTransport.Indirect; }
+ }
+
+ protected override MessageProtection RequiredProtection {
+ get { return MessageProtection.None; }
+ }
+
+ #region IDirectedProtocolMessage Members
+
+ Uri IDirectedProtocolMessage.Recipient {
+ get { return this.consumer; }
+ }
+
+ #endregion
+ }
+}
diff --git a/src/DotNetOAuth/Messages/DirectUserToServiceProviderMessage.cs b/src/DotNetOAuth/Messages/DirectUserToServiceProviderMessage.cs
new file mode 100644
index 0000000..24d3fa4
--- /dev/null
+++ b/src/DotNetOAuth/Messages/DirectUserToServiceProviderMessage.cs
@@ -0,0 +1,44 @@
+//-----------------------------------------------------------------------
+// <copyright file="DirectUserToServiceProviderMessage.cs" company="Andrew Arnott">
+// Copyright (c) Andrew Arnott. All rights reserved.
+// </copyright>
+//-----------------------------------------------------------------------
+
+namespace DotNetOAuth.Messages {
+ using System;
+ using System.Runtime.Serialization;
+ using DotNetOAuth.Messaging;
+
+ internal class DirectUserToServiceProviderMessage : MessageBase, IDirectedProtocolMessage {
+ private Uri serviceProvider;
+
+ internal DirectUserToServiceProviderMessage(Uri serviceProvider) {
+ if (serviceProvider == null) {
+ throw new ArgumentNullException("serviceProvider");
+ }
+
+ this.serviceProvider = serviceProvider;
+ }
+
+ [MessagePart(Name = "oauth_token", IsRequired = false)]
+ public string RequestToken { get; set; }
+ [MessagePart(Name = "oauth_callback", IsRequired = false)]
+ public string Callback { get; set; }
+
+ protected override MessageTransport Transport {
+ get { return MessageTransport.Indirect; }
+ }
+
+ protected override MessageProtection RequiredProtection {
+ get { return MessageProtection.None; }
+ }
+
+ #region IDirectedProtocolMessage Members
+
+ Uri IDirectedProtocolMessage.Recipient {
+ get { return this.serviceProvider; }
+ }
+
+ #endregion
+ }
+}
diff --git a/src/DotNetOAuth/Messages/GrantAccessTokenMessage.cs b/src/DotNetOAuth/Messages/GrantAccessTokenMessage.cs
new file mode 100644
index 0000000..e9a8be4
--- /dev/null
+++ b/src/DotNetOAuth/Messages/GrantAccessTokenMessage.cs
@@ -0,0 +1,29 @@
+//-----------------------------------------------------------------------
+// <copyright file="GrantAccessTokenMessage.cs" company="Andrew Arnott">
+// Copyright (c) Andrew Arnott. All rights reserved.
+// </copyright>
+//-----------------------------------------------------------------------
+
+namespace DotNetOAuth.Messages {
+ using System;
+ using System.Runtime.Serialization;
+ using DotNetOAuth.Messaging;
+
+ internal class GrantAccessTokenMessage : MessageBase {
+ internal GrantAccessTokenMessage() {
+ }
+
+ [MessagePart(Name = "oauth_token", IsRequired = true)]
+ public string AccessToken { get; set; }
+ [MessagePart(Name = "oauth_token_secret", IsRequired = true)]
+ public string TokenSecret { get; set; }
+
+ protected override MessageTransport Transport {
+ get { return MessageTransport.Direct; }
+ }
+
+ protected override MessageProtection RequiredProtection {
+ get { return MessageProtection.None; }
+ }
+ }
+}
diff --git a/src/DotNetOAuth/Messages/IOAuthProtocolDirectedMessage.cs b/src/DotNetOAuth/Messages/IOAuthProtocolDirectedMessage.cs
new file mode 100644
index 0000000..dea8de8
--- /dev/null
+++ b/src/DotNetOAuth/Messages/IOAuthProtocolDirectedMessage.cs
@@ -0,0 +1,19 @@
+//-----------------------------------------------------------------------
+// <copyright file="IOAuthProtocolDirectedMessage.cs" company="Andrew Arnott">
+// Copyright (c) Andrew Arnott. All rights reserved.
+// </copyright>
+//-----------------------------------------------------------------------
+
+namespace DotNetOAuth.Messages {
+ using DotNetOAuth.Messaging;
+
+ /// <summary>
+ /// Additional properties that apply specifically to OAuth messages.
+ /// </summary>
+ internal interface IOAuthProtocolDirectedMessage {
+ /// <summary>
+ /// Gets the preferred method of transport for the message.
+ /// </summary>
+ MessageScheme PreferredScheme { get; }
+ }
+}
diff --git a/src/DotNetOAuth/Messages/MessageBase.cs b/src/DotNetOAuth/Messages/MessageBase.cs
new file mode 100644
index 0000000..b31d6ee
--- /dev/null
+++ b/src/DotNetOAuth/Messages/MessageBase.cs
@@ -0,0 +1,41 @@
+namespace DotNetOAuth.Messages {
+ using System;
+ using System.Collections.Generic;
+ using System.Linq;
+ using System.Text;
+ using DotNetOAuth.Messaging;
+
+ internal abstract class MessageBase : IProtocolMessage {
+ private Dictionary<string, string> extraData = new Dictionary<string, string>();
+
+ #region IProtocolMessage Members
+
+ Version IProtocolMessage.ProtocolVersion {
+ get { return new Version(1, 0); }
+ }
+
+ MessageProtection IProtocolMessage.RequiredProtection {
+ get { return this.RequiredProtection; }
+ }
+
+ MessageTransport IProtocolMessage.Transport {
+ get { return this.Transport; }
+ }
+
+ IDictionary<string, string> IProtocolMessage.ExtraData {
+ get { return this.extraData; }
+ }
+
+ void IProtocolMessage.EnsureValidMessage() {
+ this.EnsureValidMessage();
+ }
+
+ #endregion
+
+ protected abstract MessageTransport Transport { get; }
+
+ protected abstract MessageProtection RequiredProtection { get; }
+
+ protected virtual void EnsureValidMessage() { }
+ }
+}
diff --git a/src/DotNetOAuth/Messages/RequestAccessTokenMessage.cs b/src/DotNetOAuth/Messages/RequestAccessTokenMessage.cs
new file mode 100644
index 0000000..5d01a90
--- /dev/null
+++ b/src/DotNetOAuth/Messages/RequestAccessTokenMessage.cs
@@ -0,0 +1,53 @@
+//-----------------------------------------------------------------------
+// <copyright file="RequestAccessTokenMessage.cs" company="Andrew Arnott">
+// Copyright (c) Andrew Arnott. All rights reserved.
+// </copyright>
+//-----------------------------------------------------------------------
+
+namespace DotNetOAuth.Messages {
+ using System;
+ using DotNetOAuth.Messaging;
+
+ internal class RequestAccessTokenMessage : MessageBase, IDirectedProtocolMessage {
+ private Uri serviceProvider;
+
+ internal RequestAccessTokenMessage(Uri serviceProvider) {
+ if (serviceProvider == null) {
+ throw new ArgumentNullException("serviceProvider");
+ }
+
+ this.serviceProvider = serviceProvider;
+ }
+
+ [MessagePart(Name = "oauth_consumer_key", IsRequired = true)]
+ public string ConsumerKey { get; set; }
+ [MessagePart(Name = "oauth_token", IsRequired = true)]
+ public string RequestToken { get; set; }
+ [MessagePart(Name = "oauth_signature_method", IsRequired = true)]
+ public string SignatureMethod { get; set; }
+ [MessagePart(Name = "oauth_signature", IsRequired = true)]
+ public string Signature { get; set; }
+ [MessagePart(Name = "oauth_timestamp", IsRequired = true)]
+ public Uri Timestamp { get; set; }
+ [MessagePart(Name = "oauth_nonce", IsRequired = true)]
+ public Uri Nonce { get; set; }
+ [MessagePart(Name = "oauth_version", IsRequired = false)]
+ public Uri Version { get; set; }
+
+ protected override DotNetOAuth.Messaging.MessageTransport Transport {
+ get { return MessageTransport.Direct; }
+ }
+
+ protected override DotNetOAuth.Messaging.MessageProtection RequiredProtection {
+ get { return MessageProtection.All; }
+ }
+
+ #region IDirectedProtocolMessage Members
+
+ Uri IDirectedProtocolMessage.Recipient {
+ get { return this.serviceProvider; }
+ }
+
+ #endregion
+ }
+}
diff --git a/src/DotNetOAuth/Messages/RequestTokenMessage.cs b/src/DotNetOAuth/Messages/RequestTokenMessage.cs
new file mode 100644
index 0000000..e327e72
--- /dev/null
+++ b/src/DotNetOAuth/Messages/RequestTokenMessage.cs
@@ -0,0 +1,52 @@
+//-----------------------------------------------------------------------
+// <copyright file="RequestTokenMessage.cs" company="Andrew Arnott">
+// Copyright (c) Andrew Arnott. All rights reserved.
+// </copyright>
+//-----------------------------------------------------------------------
+
+namespace DotNetOAuth.Messages {
+ using System;
+ using System.Runtime.Serialization;
+ using DotNetOAuth.Messaging;
+
+ internal class RequestTokenMessage : MessageBase, IDirectedProtocolMessage {
+ private Uri serviceProvider;
+
+ internal RequestTokenMessage(Uri serviceProvider) {
+ if (serviceProvider == null) {
+ throw new ArgumentNullException("serviceProvider");
+ }
+
+ this.serviceProvider = serviceProvider;
+ }
+
+ [MessagePart(Name = "oauth_consumer_key", IsRequired = true)]
+ public string ConsumerKey { get; set; }
+ [MessagePart(Name = "oauth_signature_method", IsRequired = true)]
+ public string SignatureMethod { get; set; }
+ [MessagePart(Name = "oauth_signature", IsRequired = true)]
+ public string Signature { get; set; }
+ [MessagePart(Name = "oauth_timestamp", IsRequired = true)]
+ public Uri Timestamp { get; set; }
+ [MessagePart(Name = "oauth_nonce", IsRequired = true)]
+ public Uri Nonce { get; set; }
+ [MessagePart(Name = "oauth_version", IsRequired = false)]
+ public Uri Version { get; set; }
+
+ protected override MessageTransport Transport {
+ get { return MessageTransport.Direct; }
+ }
+
+ protected override MessageProtection RequiredProtection {
+ get { return MessageProtection.All; }
+ }
+
+ #region IDirectedProtocolMessage Members
+
+ Uri IDirectedProtocolMessage.Recipient {
+ get { return this.serviceProvider; }
+ }
+
+ #endregion
+ }
+}
diff --git a/src/DotNetOAuth/Messages/UnauthorizedRequestTokenMessage.cs b/src/DotNetOAuth/Messages/UnauthorizedRequestTokenMessage.cs
new file mode 100644
index 0000000..e7a170f
--- /dev/null
+++ b/src/DotNetOAuth/Messages/UnauthorizedRequestTokenMessage.cs
@@ -0,0 +1,29 @@
+//-----------------------------------------------------------------------
+// <copyright file="UnauthorizedRequestTokenMessage.cs" company="Andrew Arnott">
+// Copyright (c) Andrew Arnott. All rights reserved.
+// </copyright>
+//-----------------------------------------------------------------------
+
+namespace DotNetOAuth.Messages {
+ using System;
+ using System.Runtime.Serialization;
+ using DotNetOAuth.Messaging;
+
+ internal class UnauthorizedRequestTokenMessage : MessageBase {
+ internal UnauthorizedRequestTokenMessage() {
+ }
+
+ [MessagePart(Name = "oauth_token", IsRequired = true)]
+ public string RequestToken { get; set; }
+ [MessagePart(Name = "oauth_token_secret", IsRequired = true)]
+ public string TokenSecret { get; set; }
+
+ protected override MessageTransport Transport {
+ get { return MessageTransport.Direct; }
+ }
+
+ protected override MessageProtection RequiredProtection {
+ get { return MessageProtection.None; }
+ }
+ }
+}
diff --git a/src/DotNetOAuth/OAuthMessageTypeProvider.cs b/src/DotNetOAuth/OAuthMessageTypeProvider.cs
index 7d4dbcd..6f6d8b6 100644
--- a/src/DotNetOAuth/OAuthMessageTypeProvider.cs
+++ b/src/DotNetOAuth/OAuthMessageTypeProvider.cs
@@ -7,8 +7,7 @@
namespace DotNetOAuth {
using System;
using System.Collections.Generic;
- using System.Linq;
- using System.Text;
+ using DotNetOAuth.Messages;
using DotNetOAuth.Messaging;
/// <summary>
@@ -23,12 +22,40 @@ namespace DotNetOAuth {
/// message is embedded in it and returns the type, or null if no match is found.
/// </summary>
/// <param name="fields">The name/value pairs that make up the message payload.</param>
+ /// <remarks>
+ /// The request messages are:
+ /// RequestTokenMessage
+ /// RequestAccessTokenMessage
+ /// DirectUserToServiceProviderMessage
+ /// AccessProtectedResourcesMessage
+ /// </remarks>
/// <returns>
/// The <see cref="IProtocolMessage"/>-derived concrete class that this message can
/// deserialize to. Null if the request isn't recognized as a valid protocol message.
/// </returns>
public Type GetRequestMessageType(IDictionary<string, string> fields) {
- throw new NotImplementedException();
+ if (fields == null) {
+ throw new ArgumentNullException("fields");
+ }
+
+ if (fields.ContainsKey("oauth_consumer_key") &&
+ !fields.ContainsKey("oauth_token")) {
+ return typeof(RequestTokenMessage);
+ }
+
+ if (fields.ContainsKey("oauth_consumer_key") &&
+ fields.ContainsKey("oauth_token")) {
+ // Discern between RequestAccessToken and AccessProtectedResources,
+ // which have all the same parameters, by figuring out what type of token
+ // is in the token parameter.
+ bool tokenTypeIsAccessToken = false; // TODO
+
+ return tokenTypeIsAccessToken ? typeof(AccessProtectedResourcesMessage) :
+ typeof(RequestAccessTokenMessage);
+ }
+
+ // fail over to the message with no required fields at all.
+ return typeof(DirectUserToServiceProviderMessage);
}
/// <summary>
@@ -37,14 +64,47 @@ namespace DotNetOAuth {
/// </summary>
/// <param name="request">
/// The message that was sent as a request that resulted in the response.
+ /// Null on a Consumer site that is receiving an indirect message from the Service Provider.
/// </param>
/// <param name="fields">The name/value pairs that make up the message payload.</param>
/// <returns>
/// The <see cref="IProtocolMessage"/>-derived concrete class that this message can
/// deserialize to. Null if the request isn't recognized as a valid protocol message.
/// </returns>
+ /// <remarks>
+ /// The response messages are:
+ /// UnauthorizedRequestTookenMessage
+ /// DirectUserToConsumerMessage
+ /// GrantAccessTokenMessage
+ /// </remarks>
public Type GetResponseMessageType(IProtocolMessage request, IDictionary<string, string> fields) {
- throw new NotImplementedException();
+ if (fields == null) {
+ throw new ArgumentNullException("fields");
+ }
+
+ // All response messages have the oauth_token field.
+ if (!fields.ContainsKey("oauth_token")) {
+ return null;
+ }
+
+ if (request == null) {
+ return typeof(DirectUserToConsumerMessage);
+ }
+
+ // All direct message responses should haev the oauth_token_secret field.
+ if (!fields.ContainsKey("oauth_token_secret")) {
+ Logger.Error("An OAuth message was expected to contain an oauth_token_secret but didn't.");
+ return null;
+ }
+
+ if (request is RequestTokenMessage) {
+ return typeof(UnauthorizedRequestTokenMessage);
+ } else if (request is RequestAccessTokenMessage) {
+ return typeof(GrantAccessTokenMessage);
+ } else {
+ Logger.ErrorFormat("Unexpected response message given the request type {0}", request.GetType().Name);
+ throw new ProtocolException(Strings.InvalidIncomingMessage);
+ }
}
#endregion
diff --git a/src/DotNetOAuth/ServiceProvider.cs b/src/DotNetOAuth/ServiceProvider.cs
index 49bfb9f..7cf41cc 100644
--- a/src/DotNetOAuth/ServiceProvider.cs
+++ b/src/DotNetOAuth/ServiceProvider.cs
@@ -33,6 +33,7 @@ namespace DotNetOAuth {
/// </summary>
/// <remarks>
/// The request URL query MUST NOT contain any OAuth Protocol Parameters.
+ /// This is the URL that <see cref="Messages.RequestTokenMessage"/> messages are directed to.
/// </remarks>
/// <exception cref="ArgumentException">Thrown if this property is set to a URI with OAuth protocol parameters.</exception>
public Uri RequestTokenUri {
@@ -52,12 +53,19 @@ namespace DotNetOAuth {
/// Gets or sets the URL used to obtain User authorization for Consumer access,
/// described in Section 6.2 (Obtaining User Authorization).
/// </summary>
+ /// <remarks>
+ /// This is the URL that <see cref="Messages.DirectUserToServiceProviderMessage"/> messages are
+ /// indirectly (via the user agent) sent to.
+ /// </remarks>
public Uri UserAuthorizationUri { get; set; }
/// <summary>
/// Gets or sets the URL used to exchange the User-authorized Request Token
/// for an Access Token, described in Section 6.3 (Obtaining an Access Token).
/// </summary>
+ /// <remarks>
+ /// This is the URL that <see cref="Messages.RequestAccessTokenMessage"/> messages are directed to.
+ /// </remarks>
public Uri AccessTokenUri { get; set; }
}
}