2016-05-25 19 views
5

Tôi đang viết một số mã để cố lấy mã thông báo để sử dụng từ Google trong OAuth2. Đây là một tài khoản dịch vụ, vì vậy các hướng dẫn đang ở đây:JWT "invalid_grant" trong Chữ ký trong Google OAuth2

https://developers.google.com/identity/protocols/OAuth2ServiceAccount

tôi tiếp tục nhận được lỗi này khi tôi đăng JWT đến Google:

{ "lỗi": "invalid_grant", "ERROR_DESCRIPTION ":" Chữ ký JWT không hợp lệ ". }

Đây là mã:

try{   
    var nowInSeconds : Number = (Date.now()/1000); 
    nowInSeconds = Math.round(nowInSeconds); 
    var fiftyNineMinutesFromNowInSeconds : Number = nowInSeconds + (59 * 60); 


    var claimSet : Object = {}; 
    claimSet.iss = "{{RemovedForPrivacy}}";   
    claimSet.scope = "https://www.googleapis.com/auth/plus.business.manage"; 
    claimSet.aud = "https://www.googleapis.com/oauth2/v4/token"; 
    claimSet.iat = nowInSeconds; 
    claimSet.exp = fiftyNineMinutesFromNowInSeconds; 

    var header : Object = {}; 
    header.alg = "RS256"; 
    header.typ = "JWT"; 

    /* Stringify These */ 
    var claimSetString = JSON.stringify(claimSet); 
    var headerString = JSON.stringify(header); 

    /* Base64 Encode These */ 
    var claimSetBaseSixtyFour = StringUtils.encodeBase64(claimSetString); 
    var headerBaseSixtyFour = StringUtils.encodeBase64(headerString); 

    var privateKey = "{{RemovedForPrivacy}}"; 

    /* Create the signature */ 
    var signature : Signature = Signature(); 
    signature = signature.sign(headerBaseSixtyFour + "." + claimSetBaseSixtyFour, privateKey , "SHA256withRSA"); 

    /* Concatenate the whole JWT */ 
    var JWT = headerBaseSixtyFour + "." + claimSetBaseSixtyFour + "." + signature; 

    /* Set Grant Type */ 
    var grantType = "urn:ietf:params:oauth:grant-type:jwt-bearer" 

    /* Create and encode the body of the token post request */ 
    var assertions : String = "grant_type=" + dw.crypto.Encoding.toURI(grantType) + "&assertion=" + dw.crypto.Encoding.toURI(JWT); 

    /* Connect to Google And Ask for Token */ 
    /* TODO Upload Certs? */ 
    var httpClient : HTTPClient = new HTTPClient(); 
    httpClient.setRequestHeader("content-type", "application/x-www-form-urlencoded; charset=utf-8"); 
    httpClient.timeout = 30000; 
    httpClient.open('POST', "https://www.googleapis.com/oauth2/v4/token"); 
    httpClient.send(assertions); 

    if (httpClient.statusCode == 200) { 
     //nothing 
    } else { 
     pdict.errorMessage = httpClient.errorText; 
    } 

} 
catch(e){ 
    Logger.error("The error with the OAuth Token Generator is --> " + e); 
} 

Có ai biết lý do tại sao JWT được không?

Cảm ơn bạn rất nhiều! Brad

+0

Kiểm tra xem khóa riêng tư của tài khoản dịch vụ của bạn vẫn hợp lệ từ bảng điều khiển đám mây –

+0

Đó có phải là Typecript không? Bạn có thể gắn thẻ câu hỏi bằng ngôn ngữ được sử dụng không? –

+0

@Brad Bạn đã tìm thấy giải pháp chưa? – bibscy

Trả lời

2

Sự cố có thể liên quan đến thực tế là phương pháp StringUtils.encodeBase64() của bạn có khả năng thực hiện mã hóa base64 chuẩn.

Theo số JWT spec, tuy nhiên, đó không phải là mã hóa tiêu chuẩn base64 cần được sử dụng, nhưng the URL- and filename-safe Base64 encoding, với các ký tự đệm = bị bỏ qua.

Nếu bạn không có một phương pháp tiện ích tiện dụng để mã hóa base64URL, bạn có thể xác minh bằng cách

  • thay thế tất cả + với -;
  • thay thế tất cả / bằng _;
  • loại bỏ tất cả =

trong chuỗi base64 mã hóa của bạn.

Ngoài ra, chữ ký của bạn có được mã hóa base64 không? Nó cần phải được, sau các quy tắc tương tự như mô tả ở trên.

+0

Robby, Điều này cực kỳ hữu ích. Câu hỏi nhanh ... khóa mà tôi tải xuống từ Google trông giống như thế này .... ----- BEGIN KEY RIÊNG ----- \ n {Bunch of stuff removed} \ n ---- -END PRIVATE KEY ----- \ n Tôi có xóa bất kỳ điều nào sau đây trước khi tôi sử dụng phím để ký? "\ n" hoặc "----- BEGIN PRIVATE KEY -----" hoặc "=" trước "----- END PRIVATE KEY ----- \ n" – Brad

+0

Không cần phải . –

+0

Cảm ơn bạn. Đó chính là vấn đề của tôi. Tôi đã có thể sử dụng 'Base64.encodeBase64URLSafeString' từ commons-codec. – Stephen

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