2014-12-31 14 views
5

タイトルの文は正しいですか。私はTaiseer Joudeh(この件に関するあなたの仕事のおかげです)の仕事について、http://bitoftech.net/2014/07/16/enable-oauth-refresh-tokens-angularjs-app-using-asp-net-web-api-2-owin/の質問に基づいています。新しいアクセス・トークンを取得するときに、oauth2のリフレッシュ・トークンを置換しないでください。

私が正しくリフレッシュトークンの振る舞いを理解していれば、アクセストークンの有効期限が切れたとき、我々は

'grant_type=refresh_token&refresh_token=' + token 

ようなもので、当社の認証サーバのトークンエンドポイントを呼び出す必要がありますし、我々は新しいアクセストークンを取り戻すだろう。その要求は、ペイロードの一部としてリフレッシュ・トークンを持ちますが、リフレッシュ・トークンは、使用したものと同じであるべきではありませんか?または少なくとも、それは同じ有効期限を持つ必要がありますか?もしそうでなければ、リフレッシュライフタイムは無限です。

これは私が渡すと予想されるfrisby.jsテストですが、TaiseerのWeb Api 2の実装を使用すると、最終的な期待は満たされません。そのトークンで新しい有効期限を持つ新しいリフレッシュトークンを取得します。

'use strict'; 

var frisby = require('frisby'); 
var config = require('../test-config.json'); 

var args = config[process.env.test || 'local']; 
var host = args.host, 
    clientId = args.clientId, 
    usr = args.user1, 
    pwd = args.password1; 

frisby.create('Try and fail to get a protected resource') 
    .get(host + '/api/test') 
    .expectStatus(401) 
    .expectHeaderContains('WWW-Authenticate', 'bearer') 
    .toss(); 

frisby.create('Log in and get a protected resource') 
    .post(host + '/token', { 
     grant_type: 'password', 
     username: usr, 
     password: pwd, 
     client_id: clientId 
    }) 
    .expectJSONTypes({ 
     access_token: String, 
     token_type: String, 
     expires_in: Number, 
     userName: String, 
     refresh_token: String, 
     'as:client_id': String, 
     '.issued': String, 
     '.expires': String 
    }) 
    .expectJSON({ 
     token_type: 'bearer', 
     userName: '[email protected]' 
    }) 
    .afterJSON(function (json) { 
     frisby.create('and now get protected resource with attached bearer token') 
      .get(host + '/api/test', { 
       headers: { 'Authorization': 'Bearer ' + json.access_token } 
      }) 
      .expectStatus(200) 
      .toss(); 
     frisby.create('and try to get a new access token with our refresh token') 
      .post(host + '/token', { 
       grant_type: 'refresh_token', 
       refresh_token: json.refresh_token, 
       client_id: clientId 
      }) 
      .afterJSON(function (json2) { 
       //we should receive a new access token 
       expect(json.access_token).not.toEqual(json2.access_token); 
       //but shouldn't the refresh token remain the same until *it* expires? 
       expect(json.refresh_token).toEqual(json2.refresh_token); 
      }) 
      .toss(); 
    }) 
    .toss(); 

答えて

5

あなたは100%正しい、リフレッシュトークンの現在の実装では、理由grant_type = refresh_token我々は新しいアクセストークンとトークン識別子をリフレッシュ発行しているため、それぞれの使用してリフレッシュトークンの有効期限をスライドしているされており、これがために完璧でした私の場合は、ユーザーがアプリケーションを使用している限り永久にログインする必要があるため、リフレッシュトークンの有効期限を超えてアプリケーションを使用しなかった場合、彼は401リフレッシュトークンを使用して新しいアクセストークンを取得します。

この動作を変更するには、リフレッシュトークン識別子を1つだけ発行し、ユーザーがリフレッシュトークンを使用して新しいアクセストークンを要求したときに同じ識別子を返す必要があります。そして、あなたはこの方法でビジネスロジックをカスタマイズすることでこれを行うことができます。

+1

ありがとう、Taiseer。このことは簡単ではありません。特にKatanaフレームワークが私たちに代わって非常に「魔法」を行っているときはそうです。それでも自分で書くよりも優れています。進行中の作業を私のレポにプッシュしました。リフレッシュプロバイダはhttps://github.com/finleysg/stats-api/blob/master/StatsApi/Providers/RefreshTokenProvider.csです。間違いなく素朴で間違っていますが、私のフリスビーテストは合格です。ログアウトについてはまったく心配ですか?私は、ログアウトアクションでユーザーのすべてのリフレッシュトークンを削除するアカウントコントローラで簡単な実装をしています。 – Stuart

+0

@Taiseer Joudehユーザーがリフレッシュトークンの有効期限を超えてアプリケーションを使用しなかった場合、リフレッシュトークンを使用して新しいアクセストークンを取得しようとすると401が表示されます。この動作を変更するには、ユーザーがリフレッシュトークンを使用して新しいアクセストークンを要求したときに、単一のリフレッシュトークン識別子のみを発行し、同じ識別子を返します。これを行うにはどうすればよいですか?また、ユーザーには永久にログインする必要があります。春のセキュリティoauth2。 – KJEjava48

関連する問題