diff options
author | Andrew Arnott <andrewarnott@gmail.com> | 2010-06-05 22:12:26 -0700 |
---|---|---|
committer | Andrew Arnott <andrewarnott@gmail.com> | 2010-06-05 22:12:26 -0700 |
commit | 54af44023fc542eed70c168adf281bd1bd94e8a2 (patch) | |
tree | 1e6737649cd0799c7aae4c213974cb4eb782475c /src | |
parent | 44b7be237574be25deb0815a423552d495a60efb (diff) | |
download | DotNetOpenAuth-54af44023fc542eed70c168adf281bd1bd94e8a2.zip DotNetOpenAuth-54af44023fc542eed70c168adf281bd1bd94e8a2.tar.gz DotNetOpenAuth-54af44023fc542eed70c168adf281bd1bd94e8a2.tar.bz2 |
Updated the Device flow so the messages match the latest spec.
Diffstat (limited to 'src')
16 files changed, 75 insertions, 109 deletions
diff --git a/src/DotNetOpenAuth.Test/OAuthWrap/MessageFactoryTests.cs b/src/DotNetOpenAuth.Test/OAuthWrap/MessageFactoryTests.cs index 9b937c1..a9a696b 100644 --- a/src/DotNetOpenAuth.Test/OAuthWrap/MessageFactoryTests.cs +++ b/src/DotNetOpenAuth.Test/OAuthWrap/MessageFactoryTests.cs @@ -221,30 +221,6 @@ namespace DotNetOpenAuth.Test.OAuthWrap { Assert.IsInstanceOf(typeof(RichAppAccessTokenRequest), request); } - [TestCase] - public void RichAppAccessTokenSuccessResponse() { - var fields = new Dictionary<string, string> { - { Protocol.refresh_token, "abc" }, - { Protocol.access_token, "abc" }, - }; - var request = new RichAppAccessTokenRequest(this.recipient.Location, Protocol.Default.Version); - Assert.IsInstanceOf( - typeof(RichAppAccessTokenSuccessResponse), - this.messageFactory.GetNewResponseMessage(request, fields)); - } - - [TestCase] - public void RichAppAccessTokenFailedResponse() { - // HTTP 401 Unauthorized - // WWW-Authenticate: WRAP - var fields = new Dictionary<string, string> { - }; - var request = new RichAppAccessTokenRequest(this.recipient.Location, Protocol.Default.Version); - Assert.IsInstanceOf( - typeof(RichAppAccessTokenFailedResponse), - this.messageFactory.GetNewResponseMessage(request, fields)); - } - #endregion #region Client Account and Password profile messages diff --git a/src/DotNetOpenAuth/DotNetOpenAuth.csproj b/src/DotNetOpenAuth/DotNetOpenAuth.csproj index 52472ff..1ba2f20 100644 --- a/src/DotNetOpenAuth/DotNetOpenAuth.csproj +++ b/src/DotNetOpenAuth/DotNetOpenAuth.csproj @@ -339,8 +339,6 @@ http://opensource.org/licenses/ms-pl.html <Compile Include="OAuthWrap\Messages\Device\RichAppAccessTokenRequest.cs" /> <Compile Include="OAuthWrap\Messages\Device\RichAppRequest.cs" /> <Compile Include="OAuthWrap\Messages\Device\RichAppResponse.cs" /> - <Compile Include="OAuthWrap\Messages\Device\RichAppAccessTokenSuccessResponse.cs" /> - <Compile Include="OAuthWrap\Messages\Device\RichAppAccessTokenFailedResponse.cs" /> <Compile Include="OAuthWrap\Messages\UnauthorizedResponse.cs" /> <Compile Include="OAuthWrap\Messages\AccessTokenFailedResponse.cs" /> <Compile Include="OAuthWrap\Messages\AccessTokenSuccessResponse.cs" /> @@ -349,8 +347,8 @@ http://opensource.org/licenses/ms-pl.html <Compile Include="OAuthWrap\Messages\UserAgent\UserAgentSuccessResponse.cs" /> <Compile Include="OAuthWrap\Messages\UsernameAndPassword\UserNamePasswordCaptchaResponse.cs" /> <Compile Include="OAuthWrap\Messages\UsernameAndPassword\UserNamePasswordVerificationResponse.cs" /> - <Compile Include="OAuthWrap\Messages\WebServer\ResponseFormat.cs" /> - <Compile Include="OAuthWrap\Messages\WebServer\ResponseFormatEncoder.cs" /> + <Compile Include="OAuthWrap\Messages\ResponseFormat.cs" /> + <Compile Include="OAuthWrap\Messages\ResponseFormatEncoder.cs" /> <Compile Include="OAuthWrap\ResourceServer.cs" /> <Compile Include="OAuthWrap\StandardAccessTokenAnalyzer.cs" /> <Compile Include="OAuthWrap\UserAgentClient.cs" /> diff --git a/src/DotNetOpenAuth/OAuthWrap/ChannelElements/OAuthWrapAuthorizationServerChannel.cs b/src/DotNetOpenAuth/OAuthWrap/ChannelElements/OAuthWrapAuthorizationServerChannel.cs index 3ba7bac..702c29a 100644 --- a/src/DotNetOpenAuth/OAuthWrap/ChannelElements/OAuthWrapAuthorizationServerChannel.cs +++ b/src/DotNetOpenAuth/OAuthWrap/ChannelElements/OAuthWrapAuthorizationServerChannel.cs @@ -35,8 +35,6 @@ namespace DotNetOpenAuth.OAuthWrap.ChannelElements { typeof(Messages.RichAppRequest), typeof(Messages.RichAppResponse), typeof(Messages.RichAppAccessTokenRequest), - typeof(Messages.RichAppAccessTokenSuccessResponse), - typeof(Messages.RichAppAccessTokenFailedResponse), typeof(Messages.UserNamePasswordRequest), typeof(Messages.UserNamePasswordSuccessResponse), typeof(Messages.UserNamePasswordVerificationResponse), diff --git a/src/DotNetOpenAuth/OAuthWrap/Messages/Assertion/AssertionRequest.cs b/src/DotNetOpenAuth/OAuthWrap/Messages/Assertion/AssertionRequest.cs index 40d25bc..2917a69 100644 --- a/src/DotNetOpenAuth/OAuthWrap/Messages/Assertion/AssertionRequest.cs +++ b/src/DotNetOpenAuth/OAuthWrap/Messages/Assertion/AssertionRequest.cs @@ -11,7 +11,6 @@ namespace DotNetOpenAuth.OAuthWrap.Messages { using System.Text; using DotNetOpenAuth.Messaging; using DotNetOpenAuth.OAuthWrap.ChannelElements; - using DotNetOpenAuth.OAuthWrap.Messages.WebServer; /// <summary> /// A request from a Client to an Authorization Server with some assertion for an access token. diff --git a/src/DotNetOpenAuth/OAuthWrap/Messages/ClientCredentials/ClientCredentialsRequest.cs b/src/DotNetOpenAuth/OAuthWrap/Messages/ClientCredentials/ClientCredentialsRequest.cs index 5de3498..506a0db 100644 --- a/src/DotNetOpenAuth/OAuthWrap/Messages/ClientCredentials/ClientCredentialsRequest.cs +++ b/src/DotNetOpenAuth/OAuthWrap/Messages/ClientCredentials/ClientCredentialsRequest.cs @@ -11,7 +11,6 @@ namespace DotNetOpenAuth.OAuthWrap.Messages { using System.Text; using DotNetOpenAuth.Messaging; using DotNetOpenAuth.OAuthWrap.ChannelElements; - using DotNetOpenAuth.OAuthWrap.Messages.WebServer; /// <summary> /// A request for an access token for a client application that has its diff --git a/src/DotNetOpenAuth/OAuthWrap/Messages/Device/RichAppAccessTokenFailedResponse.cs b/src/DotNetOpenAuth/OAuthWrap/Messages/Device/RichAppAccessTokenFailedResponse.cs deleted file mode 100644 index be4f001..0000000 --- a/src/DotNetOpenAuth/OAuthWrap/Messages/Device/RichAppAccessTokenFailedResponse.cs +++ /dev/null @@ -1,21 +0,0 @@ -//----------------------------------------------------------------------- -// <copyright file="RichAppAccessTokenFailedResponse.cs" company="Andrew Arnott"> -// Copyright (c) Andrew Arnott. All rights reserved. -// </copyright> -//----------------------------------------------------------------------- - -namespace DotNetOpenAuth.OAuthWrap.Messages { - /// <summary> - /// A response from the Authorization Server to the Client in the event - /// that an access token could not be granted. - /// </summary> - internal class RichAppAccessTokenFailedResponse : UnauthorizedResponse { - /// <summary> - /// Initializes a new instance of the <see cref="RichAppAccessTokenFailedResponse"/> class. - /// </summary> - /// <param name="request">The request.</param> - internal RichAppAccessTokenFailedResponse(RichAppAccessTokenRequest request) - : base(request) { - } - } -} diff --git a/src/DotNetOpenAuth/OAuthWrap/Messages/Device/RichAppAccessTokenRequest.cs b/src/DotNetOpenAuth/OAuthWrap/Messages/Device/RichAppAccessTokenRequest.cs index 015ef54..ee0deb7 100644 --- a/src/DotNetOpenAuth/OAuthWrap/Messages/Device/RichAppAccessTokenRequest.cs +++ b/src/DotNetOpenAuth/OAuthWrap/Messages/Device/RichAppAccessTokenRequest.cs @@ -7,15 +7,20 @@ namespace DotNetOpenAuth.OAuthWrap.Messages { using System; using System.Collections.Generic; + using System.Diagnostics.Contracts; using System.Linq; using System.Text; using DotNetOpenAuth.Messaging; + using DotNetOpenAuth.OAuthWrap.ChannelElements; /// <summary> /// A message from the Client to the Authorization Server exchanging a /// verification code for refresh and access tokens. /// </summary> - internal class RichAppAccessTokenRequest : MessageBase { + internal class RichAppAccessTokenRequest : MessageBase, IAccessTokenRequest, IOAuthDirectResponseFormat { + [MessagePart(Protocol.type, IsRequired = true)] + private const string MessageType = "device_token"; + /// <summary> /// Initializes a new instance of the <see cref="RichAppAccessTokenRequest"/> class. /// </summary> @@ -27,11 +32,29 @@ namespace DotNetOpenAuth.OAuthWrap.Messages { } /// <summary> + /// Initializes a new instance of the <see cref="RichAppAccessTokenRequest"/> class. + /// </summary> + /// <param name="authorizationServer">The authorization server.</param> + internal RichAppAccessTokenRequest(AuthorizationServerDescription authorizationServer) + : this(authorizationServer.TokenEndpoint, authorizationServer.Version) { + Contract.Requires<ArgumentNullException>(authorizationServer != null); + Contract.Requires<ArgumentException>(authorizationServer.Version != null); + Contract.Requires<ArgumentException>(authorizationServer.TokenEndpoint != null); + + // We prefer URL encoding of the data. + this.Format = ResponseFormat.Form; + } + + /// <summary> /// Gets or sets the identifier by which this client is known to the Authorization Server. /// </summary> /// <value>The client identifier.</value> [MessagePart(Protocol.client_id, IsRequired = true, AllowEmpty = false)] - internal string ClientIdentifier { get; set; } + public string ClientIdentifier { get; internal set; } + + string IAccessTokenRequest.ClientSecret { + get { return null; } + } /// <summary> /// Gets or sets the verification code previously communicated to the Client @@ -42,6 +65,23 @@ namespace DotNetOpenAuth.OAuthWrap.Messages { internal string VerificationCode { get; set; } /// <summary> + /// Gets or sets the type of the secret. + /// </summary> + /// <value>The type of the secret.</value> + /// <remarks> + /// OPTIONAL. The access token secret type as described by Section 5.3 (Cryptographic Tokens Requests). If omitted, the authorization server will issue a bearer token (an access token without a matching secret) as described by Section 5.2 (Bearer Token Requests). + /// </remarks> + [MessagePart(Protocol.secret_type, IsRequired = false, AllowEmpty = false)] + public string SecretType { get; set; } + + ResponseFormat IOAuthDirectResponseFormat.Format { + get { return this.Format.HasValue ? this.Format.Value : ResponseFormat.Json; } + } + + [MessagePart(Protocol.format, Encoder = typeof(ResponseFormatEncoder))] + private ResponseFormat? Format { get; set; } + + /// <summary> /// Checks the message state for conformity to the protocol specification /// and throws an exception if the message is invalid. /// </summary> diff --git a/src/DotNetOpenAuth/OAuthWrap/Messages/Device/RichAppAccessTokenSuccessResponse.cs b/src/DotNetOpenAuth/OAuthWrap/Messages/Device/RichAppAccessTokenSuccessResponse.cs deleted file mode 100644 index 17979e4..0000000 --- a/src/DotNetOpenAuth/OAuthWrap/Messages/Device/RichAppAccessTokenSuccessResponse.cs +++ /dev/null @@ -1,45 +0,0 @@ -//----------------------------------------------------------------------- -// <copyright file="RichAppAccessTokenSuccessResponse.cs" company="Andrew Arnott"> -// Copyright (c) Andrew Arnott. All rights reserved. -// </copyright> -//----------------------------------------------------------------------- - -namespace DotNetOpenAuth.OAuthWrap.Messages { - using System; - using DotNetOpenAuth.Messaging; - - /// <summary> - /// The direct response message that contains the access token from the Authorization Server - /// to the Client. - /// </summary> - internal class RichAppAccessTokenSuccessResponse : MessageBase { - /// <summary> - /// Initializes a new instance of the <see cref="RichAppAccessTokenSuccessResponse"/> class. - /// </summary> - /// <param name="request">The request.</param> - internal RichAppAccessTokenSuccessResponse(RichAppAccessTokenRequest request) - : base(request) { - } - - /// <summary> - /// Gets or sets the refresh token. - /// </summary> - /// <value>The token.</value> - [MessagePart(Protocol.refresh_token, IsRequired = true, AllowEmpty = false)] - internal string RefreshToken { get; set; } - - /// <summary> - /// Gets or sets the access token. - /// </summary> - /// <value>The token.</value> - [MessagePart(Protocol.access_token, IsRequired = true, AllowEmpty = false)] - internal string AccessToken { get; set; } - - /// <summary> - /// Gets or sets the lifetime of the access token. - /// </summary> - /// <value>The lifetime.</value> - [MessagePart(Protocol.expires_in, IsRequired = false, AllowEmpty = false, Encoder = typeof(TimespanSecondsEncoder))] - internal TimeSpan? Lifetime { get; set; } - } -} diff --git a/src/DotNetOpenAuth/OAuthWrap/Messages/Device/RichAppRequest.cs b/src/DotNetOpenAuth/OAuthWrap/Messages/Device/RichAppRequest.cs index b392c52..d6ee485 100644 --- a/src/DotNetOpenAuth/OAuthWrap/Messages/Device/RichAppRequest.cs +++ b/src/DotNetOpenAuth/OAuthWrap/Messages/Device/RichAppRequest.cs @@ -7,6 +7,7 @@ namespace DotNetOpenAuth.OAuthWrap.Messages { using System; using System.Collections.Generic; + using System.Diagnostics.Contracts; using System.Linq; using System.Text; using DotNetOpenAuth.Messaging; @@ -15,7 +16,7 @@ namespace DotNetOpenAuth.OAuthWrap.Messages { /// A request from a rich app Client to an Authorization Server requested /// authorization to access user Protected Data. /// </summary> - internal class RichAppRequest : MessageBase { + internal class RichAppRequest : MessageBase, IOAuthDirectResponseFormat { [MessagePart(Protocol.type, IsRequired = true)] private const string MessageType = "device_code"; @@ -30,6 +31,20 @@ namespace DotNetOpenAuth.OAuthWrap.Messages { } /// <summary> + /// Initializes a new instance of the <see cref="RichAppRequest"/> class. + /// </summary> + /// <param name="authorizationServer">The authorization server.</param> + internal RichAppRequest(AuthorizationServerDescription authorizationServer) + : this(authorizationServer.TokenEndpoint, authorizationServer.Version) { + Contract.Requires<ArgumentNullException>(authorizationServer != null); + Contract.Requires<ArgumentException>(authorizationServer.Version != null); + Contract.Requires<ArgumentException>(authorizationServer.TokenEndpoint != null); + + // We prefer URL encoding of the data. + this.Format = ResponseFormat.Form; + } + + /// <summary> /// Gets or sets the client identifier previously obtained from the Authorization Server. /// </summary> /// <value>The client identifier.</value> @@ -42,5 +57,12 @@ namespace DotNetOpenAuth.OAuthWrap.Messages { /// <value>The Authorization Server MAY define authorization scope values for the Client to include.</value> [MessagePart(Protocol.scope, IsRequired = false, AllowEmpty = true)] internal string Scope { get; set; } + + ResponseFormat IOAuthDirectResponseFormat.Format { + get { return this.Format.HasValue ? this.Format.Value : ResponseFormat.Json; } + } + + [MessagePart(Protocol.format, Encoder = typeof(ResponseFormatEncoder))] + private ResponseFormat? Format { get; set; } } } diff --git a/src/DotNetOpenAuth/OAuthWrap/Messages/Device/RichAppResponse.cs b/src/DotNetOpenAuth/OAuthWrap/Messages/Device/RichAppResponse.cs index 4a93a45..98a7b6e 100644 --- a/src/DotNetOpenAuth/OAuthWrap/Messages/Device/RichAppResponse.cs +++ b/src/DotNetOpenAuth/OAuthWrap/Messages/Device/RichAppResponse.cs @@ -44,8 +44,11 @@ namespace DotNetOpenAuth.OAuthWrap.Messages { /// <summary> /// Gets or sets the user authorization URI on the authorization server. /// </summary> - [MessagePart(Protocol.user_uri, IsRequired = true)] - internal Uri AuthorizationUri { get; set; } + /// <value> + /// REQUIRED. The end-user verification URI on the authorization server. The URI should be short and easy to remember as end-users will be asked to manually type it into their user-agent. + /// </value> + [MessagePart(Protocol.verification_uri, IsRequired = true)] + internal Uri VerificationUri { get; set; } /// <summary> /// Gets or sets the lifetime. diff --git a/src/DotNetOpenAuth/OAuthWrap/Messages/RefreshAccessTokenRequest.cs b/src/DotNetOpenAuth/OAuthWrap/Messages/RefreshAccessTokenRequest.cs index ca8c6dc..ad4d45c 100644 --- a/src/DotNetOpenAuth/OAuthWrap/Messages/RefreshAccessTokenRequest.cs +++ b/src/DotNetOpenAuth/OAuthWrap/Messages/RefreshAccessTokenRequest.cs @@ -8,7 +8,6 @@ namespace DotNetOpenAuth.OAuthWrap.Messages { using System; using DotNetOpenAuth.Messaging; using DotNetOpenAuth.OAuthWrap.ChannelElements; - using DotNetOpenAuth.OAuthWrap.Messages.WebServer; /// <summary> /// A request from the client to the token endpoint for a new access token diff --git a/src/DotNetOpenAuth/OAuthWrap/Messages/WebServer/ResponseFormat.cs b/src/DotNetOpenAuth/OAuthWrap/Messages/ResponseFormat.cs index 720c62b..720c62b 100644 --- a/src/DotNetOpenAuth/OAuthWrap/Messages/WebServer/ResponseFormat.cs +++ b/src/DotNetOpenAuth/OAuthWrap/Messages/ResponseFormat.cs diff --git a/src/DotNetOpenAuth/OAuthWrap/Messages/WebServer/ResponseFormatEncoder.cs b/src/DotNetOpenAuth/OAuthWrap/Messages/ResponseFormatEncoder.cs index f806b4e..6cf879c 100644 --- a/src/DotNetOpenAuth/OAuthWrap/Messages/WebServer/ResponseFormatEncoder.cs +++ b/src/DotNetOpenAuth/OAuthWrap/Messages/ResponseFormatEncoder.cs @@ -4,7 +4,7 @@ // </copyright> //----------------------------------------------------------------------- -namespace DotNetOpenAuth.OAuthWrap.Messages.WebServer { +namespace DotNetOpenAuth.OAuthWrap.Messages { using System; using System.Collections.Generic; using System.Linq; diff --git a/src/DotNetOpenAuth/OAuthWrap/Messages/UsernameAndPassword/UserNamePasswordRequest.cs b/src/DotNetOpenAuth/OAuthWrap/Messages/UsernameAndPassword/UserNamePasswordRequest.cs index 297f480..dedcc3e 100644 --- a/src/DotNetOpenAuth/OAuthWrap/Messages/UsernameAndPassword/UserNamePasswordRequest.cs +++ b/src/DotNetOpenAuth/OAuthWrap/Messages/UsernameAndPassword/UserNamePasswordRequest.cs @@ -12,7 +12,6 @@ namespace DotNetOpenAuth.OAuthWrap.Messages { using System.Text; using DotNetOpenAuth.Messaging; using DotNetOpenAuth.OAuthWrap.ChannelElements; - using DotNetOpenAuth.OAuthWrap.Messages.WebServer; /// <summary> /// A request for a delegation code in exchange for a user's confidential diff --git a/src/DotNetOpenAuth/OAuthWrap/Messages/WebServer/WebAppAccessTokenRequest.cs b/src/DotNetOpenAuth/OAuthWrap/Messages/WebServer/WebAppAccessTokenRequest.cs index 727b21f..ccfc8a3 100644 --- a/src/DotNetOpenAuth/OAuthWrap/Messages/WebServer/WebAppAccessTokenRequest.cs +++ b/src/DotNetOpenAuth/OAuthWrap/Messages/WebServer/WebAppAccessTokenRequest.cs @@ -10,7 +10,6 @@ namespace DotNetOpenAuth.OAuthWrap.Messages { using ChannelElements; using Configuration; using Messaging; - using WebServer; /// <summary> /// A message sent by the Client directly to the Authorization Server to exchange diff --git a/src/DotNetOpenAuth/OAuthWrap/Protocol.cs b/src/DotNetOpenAuth/OAuthWrap/Protocol.cs index d42e4e2..074f794 100644 --- a/src/DotNetOpenAuth/OAuthWrap/Protocol.cs +++ b/src/DotNetOpenAuth/OAuthWrap/Protocol.cs @@ -99,9 +99,9 @@ namespace DotNetOpenAuth.OAuthWrap { internal const string user_code = "user_code"; /// <summary> - /// The "user_uri" string. + /// The "verification_uri" string. /// </summary> - internal const string user_uri = "user_uri"; + internal const string verification_uri = "verification_uri"; /// <summary> /// The "interval" string. |