2012-04-05 8 views
1

クライアントクレデンシャルがリフレッシュトークンを返さない(DotNetOpenAuth.OAuth2.AuthorizationServer.PrepareAccessTokenRequestが禁止する)。しかし、ClientBase.AuthorizeRequestはそれを必要とします。 これはDotNetOpenAuthのバグですか?何か間違っていますか?リフレッシュトークンが不足しているため、AuthorizeRequestでクライアントクレデンシャルが失敗する

私は、ClientBaseを継承し、AuthorizeRequestをオーバーライドすることで対処できると思います。それは正しいことですか?

編集:DotNetOpenAuthの外部でClientBaseを継承するのは簡単ではありません。必要なものは多くが内部のみであるためです。例えばErrorUtilities.VerifyProtocol

EDIT2:ちょうどDotNetOpenAuth.OAuth2.AuthorizationServer.PrepareAccessTokenRequest中にドラフトのOAuth 2仕様(ドラフト25)と呼ばを読んで、それがクライアントの資格情報の許可タイプのリフレッシュトークンを許可しないところ、私は見つけることができません。多分彼らはそれを変えたのだろうか?

答えて

2

なぜClientBase.AuthorizeRequestが必要なのかわかりません。まず、アクセストークンのみを必要とするオーバーロードがあるため、にさえ、にリフレッシュトークンを要求しません。試行したオーバーロードはIAuthorizationStateオブジェクトを受け取ります。リフレッシュトークンが含まれていてもいなくてもかまいません。また、アクセストークンが期限切れになっている場合にのみリフレッシュトークンを探します。有効期限が切れたアクセストークンは使用できないため、リフレッシュしようとします。できない場合はスローします。それは私には合理的なようです。

どのメソッドオーバーロードを呼び出しても、呼び出しモードでは、期限切れのアクセストークンを使用しないようにするか、DotNetOpenAuthまたはリソースサーバーが期限切れまたは失効したと判断したときにスローされる例外に応答する必要があります。実際、トークンは期限が切れる前に取り消すことができるので、常にそれに備えておくのが良い考えです。

実際に、OAuth 2仕様ドラフト25は、リフレッシュトークンをクライアントクレデンシャルの許可への応答に含めるべきでないことを示しています。 section 4.4.3から:

4.4.3。アクセストークン応答

アクセストークン要求が有効で許可されている場合、許可サーバーはセクション5.1で説明されているようにアクセストークンを発行します。 リフレッシュトークンは含まれていてはなりません。要求がクライアント認証に失敗したか、無効である場合、許可サーバーはセクション5.2で説明されているようにエラー応答を返します。

+0

あなたは正しいです(もちろん)、私は盲目(または愚かな、または両方)に行かなければなりません。あなたの助けをしてくれてありがとう。 – Ian1971

3

リクエストした場合は、GoogleからRefresh Tokenを返します。クエリ文字列access_type = offlineにパラメータを指定します。 DotNetOpenAuthを使用してhttps://accounts.google.com/o/oauth2/auth?access_type=offline

GoogleのアピC#の例:私の場合は

私がデフォルトの許可エンドポイントURLを改正しなければならなかった私の経験から

private WebServerClient GetClient() 
    { 
     return new WebServerClient(
      new AuthorizationServerDescription 
      { 
       AuthorizationEndpoint = new Uri("https://accounts.google.com/o/oauth2/auth?access_type=offline"), 
       TokenEndpoint = new Uri("https://accounts.google.com/o/oauth2/token"), 
       ProtocolVersion = ProtocolVersion.V20, 
      }, 
      clientIdentifier: this.settings.GoogleApisClientIdentifier, 
      clientSecret: this.settings.GoogleApisClientSecret 
      ); 
    } 

は注:これはのみ最初にのために働きます要求。

Google Documentationを参照してください。

関連する問題