2014-12-31 28 views
5

Câu lệnh trong tiêu đề có đúng không? Tôi đang đặt câu hỏi về công việc của Taiseer Joudeh (cảm ơn công việc của bạn về chủ đề này, btw) tại http://bitoftech.net/2014/07/16/enable-oauth-refresh-tokens-angularjs-app-using-asp-net-web-api-2-owin/.Không thể thay thế mã thông báo làm mới trong oauth2 khi nhận mã thông báo truy cập mới

Nếu tôi hiểu hành vi của refresh mã thông báo một cách chính xác, khi một thẻ truy cập hết hạn, chúng ta nên gọi là thiết bị đầu cuối thẻ của máy chủ auth của chúng tôi với một cái gì đó giống như

'grant_type=refresh_token&refresh_token=' + token 

và chúng tôi sẽ liên lạc lại một mã thông báo truy cập mới. Yêu cầu đó sẽ có mã thông báo làm mới như một phần của tải trọng, nhưng không nên mã thông báo làm mới đó giống với mã thông báo chúng tôi vừa sử dụng? Hoặc ít nhất, nó sẽ có cùng thời hạn? Nếu không, thì thực sự, thời gian làm mới là vô hạn.

Dưới đây là các bài kiểm tra frisby.js tôi mong đợi sẽ vượt qua, nhưng sử dụng triển khai của Taiseer cho Web Api 2, kỳ vọng cuối cùng không thành công. Chúng tôi nhận được mã thông báo làm mới mới với ngày hết hạn mới trên mã thông báo đó.

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

Trả lời

5

Bạn đang 100% đúng, việc thực hiện hiện tại của refresh mã thông báo đã trượt hết hạn cho thẻ làm mới bởi vì với mỗi lần sử dụng cho grant_type = refresh_token chúng tôi đang phát hành truy cập mới token và làm mới định danh thẻ, và điều này là hoàn hảo cho trường hợp của tôi vì tôi muốn người dùng đăng nhập mãi mãi miễn là anh ấy đang sử dụng ứng dụng, nếu anh ấy không sử dụng ứng dụng trong một khoảng thời gian lớn hơn thì ngày hết hạn cho mã thông báo làm mới thì anh ấy sẽ nhận được 401 khi anh ấy cố gắng nhận mã thông báo truy cập mới bằng mã thông báo làm mới.

Để thay đổi hành vi này, bạn cần chỉ phát hành mã nhận dạng mã thông báo làm mới đơn và trả lại cùng số nhận dạng khi người dùng yêu cầu mã thông báo truy cập mới bằng mã thông báo làm mới. Và bạn có thể làm điều này bằng cách tùy chỉnh logic nghiệp vụ trong phương pháp này và điều này.

+1

Xin cảm ơn, Taiseer. Công cụ này không phải là dễ dàng, đặc biệt là khi khung Katana đang làm rất nhiều "phép thuật" thay mặt chúng ta. Tuy nhiên có lẽ tốt hơn là tự viết nó. Tôi đã đẩy công việc của tôi đang tiến hành tới repo của tôi - nhà cung cấp dịch vụ làm mới có tại đây: https://github.com/finleysg/stats-api/blob/master/StatsApi/Providers/RefreshTokenProvider.cs. Không nghi ngờ gì vẫn ngây thơ và không chính xác, nhưng các bài kiểm tra frisby của tôi đang trôi qua. Bạn có lo lắng về Đăng xuất không? Tôi có một thực hiện đơn giản trong bộ điều khiển tài khoản xóa tất cả mã thông báo làm mới cho người dùng trên hành động đăng xuất. – Stuart

+0

@Taiseer Joudeh nếu người dùng không sử dụng ứng dụng trong một khoảng thời gian lớn hơn thì ngày hết hạn cho mã thông báo làm mới sau đó anh ta sẽ nhận được 401 khi anh ta cố gắng lấy mã thông báo truy cập mới bằng cách sử dụng mã thông báo làm mới.Để thay đổi hành vi này bạn cần chỉ phát hành mã nhận dạng mã thông báo làm mới đơn và trả về cùng một số nhận dạng khi người dùng yêu cầu mã thông báo truy cập mới bằng mã thông báo làm mới. Tôi có thể làm như thế nào? Tôi cũng muốn người dùng đăng nhập mãi mãi.Có thể hiển thị một số ví dụ về điều này trong an ninh mùa xuân oauth2. – KJEjava48

Các vấn đề liên quan