2014-12-31 16 views
5

Başlıkta ifade doğru mu? Taiseer Joudeh'in (bu konudaki çalışmalarınız için teşekkürler, btw) http://bitoftech.net/2014/07/16/enable-oauth-refresh-tokens-angularjs-app-using-asp-net-web-api-2-owin/ numaralı telefondaki çalışmasına dayandığım soru. Ben bir erişim belirteci süresi dolduğunda yenileme davranışı doğru Jetonlar anlıyorsanızOauth2'deki yenileme simgeleri, yeni erişim kodu alınırken değiştirilmemelidir

, biz

'grant_type=refresh_token&refresh_token=' + token 

gibi bir şeyle bizim yetkilendirme sunucusunun belirteç uç noktasını çağırmalıdır ve biz yeni bir erişim belirteci geri alacak. Bu isteğin, yükün bir parçası olarak yenileme belirteci olacak, ancak bu yenileme belirteci, kullandığımızla aynı olmamalı mı? Ya da en azından aynı bitime sahip olmalı? Değilse, gerçekten, yenileme ömrü sonsuzdur.

Burada geçmek istediğim frisby.js sınamaları var, ancak Taiseer'in Web Api 2 için uygulamasının kullanılmasıyla, son beklenti başarısız oluyor. Bu belirteçle yeni bir son kullanma tarihi olan yeni bir yenileme jetonu alıyoruz.

'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(); 

cevap

5

Sen% 100 doğru, yenileme jetonuyla geçerli uygulaması nedeniyle grant_type = refresh_token yeni erişim belirteci ve belirteç tanıtıcı yenilemek yayımlıyoruz için her kullanımdan ile yenileme jetonuyla için süre sonu kayan gelmiştir edilir ve bunun için mükemmel oldu Benim durumum, kullanıcının uygulamayı kullandığı sürece sonsuza kadar oturum açmasını istediğimden, uygulamayı o zamandan daha uzun bir süre kullanmamışsa, yenileme token için son kullanma tarihini sonra 401 alacak yenileme belirtecini kullanarak yeni erişim belirteci edinin.

Bu davranışı değiştirmek için, yalnızca tek yenileme belirteci tanımlayıcısı vermeniz ve kullanıcı yenileme belirtecini kullanarak yeni erişim belirteci istediğinde aynı tanımlayıcıyı döndürmeniz gerekir. Ve iş mantığını bu yöntemde ve bunu da özelleştirerek bunu yapabilirsiniz.

+1

Teşekkürler, Taiseer. Bu şeyler kolay değil, özellikle de Katana çerçevesi bizim adımıza çok fazla "sihir" yapıyorsa. Yine de kendimizi yazmaktan daha iyi. Devam etmekte olan çalışmalarımı repo'ma ittim - yenileme sağlayıcısı burada: https://github.com/finleysg/stats-api/blob/master/StatsApi/Providers/RefreshTokenProvider.cs. Şüphesiz hala naif ve yanlış, ama frisby testlerim geçiyor. Çıkış hakkında endişeleniyor musunuz? Hesap denetleyicisinde, oturum kapatma eyleminde bir kullanıcı için tüm yenileme simgelerini silen basit bir uygulama var. – Stuart

+0

@Taiseer Joudeh, uygulamayı, yenileme jetonunun son kullanma tarihinden daha uzun bir süre boyunca kullanmadıysa, o zaman yenileme belirtecini kullanarak yeni erişim belirteci almaya çalıştığında 401 alır. Bu davranışı değiştirmek için tek yenileme belirteci tanımlayıcısını çıkarır ve kullanıcı yenileme belirtecini kullanarak yeni erişim belirteci istediğinde aynı tanımlayıcıyı döndürür. Bunu yapabilir miyim? Ayrıca, kullanıcının sonsuza kadar oturum açmasını istiyorum. bahar güvenliği oauth2. – KJEjava48

İlgili konular