タイトルの文は正しいですか。私は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();
ありがとう、Taiseer。このことは簡単ではありません。特にKatanaフレームワークが私たちに代わって非常に「魔法」を行っているときはそうです。それでも自分で書くよりも優れています。進行中の作業を私のレポにプッシュしました。リフレッシュプロバイダはhttps://github.com/finleysg/stats-api/blob/master/StatsApi/Providers/RefreshTokenProvider.csです。間違いなく素朴で間違っていますが、私のフリスビーテストは合格です。ログアウトについてはまったく心配ですか?私は、ログアウトアクションでユーザーのすべてのリフレッシュトークンを削除するアカウントコントローラで簡単な実装をしています。 – Stuart
@Taiseer Joudehユーザーがリフレッシュトークンの有効期限を超えてアプリケーションを使用しなかった場合、リフレッシュトークンを使用して新しいアクセストークンを取得しようとすると401が表示されます。この動作を変更するには、ユーザーがリフレッシュトークンを使用して新しいアクセストークンを要求したときに、単一のリフレッシュトークン識別子のみを発行し、同じ識別子を返します。これを行うにはどうすればよいですか?また、ユーザーには永久にログインする必要があります。春のセキュリティoauth2。 – KJEjava48