7

Tôi không thể nhận id_token của người dùng (https://developers.google.com/accounts/docs/CrossClientAuth) từ api nhận dạng Chrome (https://developer.chrome.com/apps/identity).Có thể nhận mã thông báo Id với Api của ứng dụng Chrome Indent không?

tôi có thể nhận được một access_token bằng cách sử dụng mẫu bản sắc chrome khi phần oauth trong biểu hiện là:

"oauth2": { 
    "client_id": "<chrome-app-client-id>.apps.googleusercontent.com", 
    "scopes": ["https://www.googleapis.com/auth/plus.login"] 
} 

Nhưng khi tôi cố gắng để có được những id_token theo cùng một cách tôi nhận được nó trên client Android của tôi một get lỗi:

"yêu cầu OAuth2 thất bại: Dịch vụ đáp ứng với lỗi: 'phạm vi hợp lệ: {0}"}

phần biểu hiện bây giờ là:

"oauth2": { 
    "client_id": "<chrome-app-client-id>.apps.googleusercontent.com", 
    "scopes": ["audience:server:client_id:<app-engine-client-id>.apps.googleusercontent.com"] 
} 

Trên Android, tôi nhận id_token bằng cách chuyển cùng chuỗi phạm vi đến android.gms.auth.GoogleAuthUtil.getToken(), nhưng tôi không thể làm cho nó hoạt động với api nhận dạng chrome.

Có thể tải id_token bằng Apent App Indentity của Chrome không? Nếu không, làm cách nào tôi có thể nhận id_token cho ứng dụng Chrome của mình?

Cảm ơn sự giúp đỡ của bạn!

+0

Thuật ngữ với OAuth là điên. Trong bài đăng của bạn, bạn tham khảo "id người dùng", "client_id", "id token" và "id". Bạn có thể chính xác về chính xác những gì bạn đang cố gắng để có được? (Tôi biết một vài điều về "client_id", "id" quá chung chung đối với tôi để hiểu và tôi không chắc chắn "id người dùng" là gì.) –

+0

Đồng ý, có một vài thuật ngữ bạn cần giữ tách rời. Đã chỉnh sửa bài đăng để rõ ràng. Client_id được đề cập trên liên kết đầu tiên trong bài đăng, cần phải chỉ định đối tượng trong id_token. Tôi nghĩ rõ ràng là tôi muốn một id_token có thể được xác minh khi được thêm vào https://www.googleapis.com/oauth2/v1/tokeninfo?id_token= – chris

+0

Bạn đã thử thêm 'openid' vào phạm vi chưa? Đây thường là gợi ý bắt buộc để đưa máy chủ vào chế độ OpenID Connect và phát hành Mã thông báo ID. –

Trả lời

-1

Trước tiên, tôi giả định rằng trong đoạn mã manifest.json của bạn, bạn không có nghĩa là client_id của bạn theo nghĩa đen là "<chrome-app-client-id>.apps.googleusercontent.com. Nó phải là một cái gì đó như 9414861317621.apps.googleusercontent.com - thứ mà bạn có được từ Bảng điều khiển dành cho nhà phát triển hoặc bất kỳ trang web Google nào bạn đã sử dụng để đăng ký ứng dụng.

Giả sử ở trên là OK, và bạn có quyền client_id, và phạm vi đúng, bạn sẽ có được những gì được gọi là một "OAuth2 access token" với một cuộc gọi đến chrome.identity.getAuthToken. Vì bạn không hiển thị cho chúng tôi bất kỳ mã JavaScript nào, tôi không thể biết đây có phải là những gì bạn đang làm hay không. Mã truy cập bạn nhận được bạn cần lưu để sử dụng sau này khi bạn gọi một hàm API. Ví dụ:

var access_token; 

chrome.identity.getAuthToken(
    { 
     'interactive': true 
    }, 
    function(token) { 
     access_token = token; 
     // do something if you like to indicate 
     // that the app is authorized 
    } 
); 

Sau đó, khi bạn thực hiện cuộc gọi API, bạn cung cấp mà access token, như thế này:

var url = 'https://www.googleapis.com/' + method; 
Ajax.ajaxSend(url, "json", 
    function (status, response) { 
     if (response && response.error && response.error.message) 
      errorCallback(response.error.message); 
     else if (status == 200) 
      successCallback(response); 
     else 
      errorCallback('Result code: ' + status); 
    }, 
    function (e) { 
     if (errorCallback) 
      errorCallback('Communication error'); 
    }, 
    { 
     Authorization: 'Bearer ' + access_token 
    } 
); 

Ajax.ajaxSend là chức năng của riêng tôi:

var Ajax = (function() { 
    var api = { 
     ajaxSend: function (url, responseType, successCallback, errorCallback, headers) { 
      var req = new XMLHttpRequest(); 
      req.onload = function (e) { 
       successCallback(req.status, req.response); 
      }; 
      req.onerror = errorCallback; 
      req.responseType = responseType ? responseType : "text"; 
      req.open("get", url); 
      if (headers) 
       for (var v in headers) 
        req.setRequestHeader(v, headers[v]); 
      req.send(); 
     } 
    }; 
    return api; 
})(); 

Các khác chức năng không xác định cũng là những gì bạn mong đợi. Đối số thứ ba là Ajax.ajaxSend là tiêu đề được gửi cùng. (Xin lỗi, tôi không có thời gian để phát triển mã độc lập chỉ cho câu trả lời này.)

Tôi hy vọng điều này hữu ích.

+1

Cảm ơn bạn đã cố gắng giúp đỡ, nhưng đây không phải là câu trả lời cho câu hỏi của tôi. Trong câu hỏi của tôi trên dòng 3 tôi nói rằng tôi biết làm thế nào để có được một access_token (tôi bao gồm để tránh câu trả lời giải thích làm thế nào để có được một). Những gì tôi đang cố gắng để có được là một id_token (một mã thông báo có thể được xác nhận khi được nối vào url này: "googleapis.com/oauth2/v1/tokeninfo?id_token=") – chris

+0

Bạn đã bao giờ tìm ra điều này chưa? Tôi cũng đang cố gắng làm như vậy. Cảm ơn. – rsb

+0

vẫn đang vật lộn với điều này:/ – kidCoder

5

Tôi đã gặp vấn đề tương tự hôm qua và vì tôi đã tìm được giải pháp, tôi cũng có thể chia sẻ nó, vì điều đó không rõ ràng. Theo tôi biết Google không cung cấp cách trực tiếp và tài liệu để thực hiện việc này, nhưng bạn có thể sử dụng chức năng chrome.identity.launchWebAuthFlow().

Trước tiên, bạn cần tạo ứng dụng web thông tin đăng nhập trong bảng điều khiển google và thêm url sau làm Authorized redirect URI: https://<EXTENSION_OR_APP_ID>.chromiumapp.org hợp lệ. URI không phải tồn tại, chrome sẽ chỉ chuyển hướng đến URL này và gọi hàm gọi lại của bạn sau.

manifest.json:

{ 
    "manifest_version": 2, 
    "name": "name", 
    "description": "description", 
    "version": "0.0.0.1", 
    "background": { 
    "scripts": ["background.js"] 
    }, 
    "permissions": [ 
    "identity" 
    ], 
    "oauth2": { 
    "client_id": "<CLIENT_ID>.apps.googleusercontent.com", 
    "scopes": [ 
     "openid", "email", "profile" 
    ] 
    } 
} 

background.js:

// Using chrome.identity 
var manifest = chrome.runtime.getManifest(); 

var clientId = encodeURIComponent(manifest.oauth2.client_id); 
var scopes = encodeURIComponent(manifest.oauth2.scopes.join(' ')); 
var redirectUri = encodeURIComponent('https://' + chrome.runtime.id + '.chromiumapp.org'); 

var url = 'https://accounts.google.com/o/oauth2/auth' + 
      '?client_id=' + clientId + 
      '&response_type=id_token' + 
      '&access_type=offline' + 
      '&redirect_uri=' + redirectUri + 
      '&scope=' + scopes; 

chrome.identity.launchWebAuthFlow(
    { 
     'url': url, 
     'interactive':true 
    }, 
    function(redirectedTo) { 
     if (chrome.runtime.lastError) { 
      // Example: Authorization page could not be loaded. 
      console.log(chrome.runtime.lastError.message); 
     } 
     else { 
      var response = redirectedTo.split('#', 2)[1]; 

      // Example: id_token=<YOUR_BELOVED_ID_TOKEN>&authuser=0&hd=<SOME.DOMAIN.PL>&session_state=<SESSION_SATE>&prompt=<PROMPT> 
      console.log(response); 
     } 
    } 
); 

Google OAuth2 API (đối với OpenID Connect) tài liệu có thể được tìm thấy ở đây: https://developers.google.com/identity/protocols/OpenIDConnect#authenticationuriparameters

PS : Nếu bạn không cần phần oauth2 trong tệp kê khai của mình. Bạn có thể bỏ qua nó một cách an toàn và chỉ cung cấp mã định danh và phạm vi trong mã.

EDIT: Đối với những người quan tâm, bạn không cần API danh tính. Bạn thậm chí có thể truy cập mã thông báo bằng cách sử dụng một mẹo nhỏ với API tab. Mã này dài hơn một chút, nhưng bạn có thông báo lỗi và kiểm soát tốt hơn. Xin lưu ý rằng trong ví dụ sau, bạn cần tạo Ứng dụng Chrome thông tin xác thực.

manifest.json:

{ 
    "manifest_version": 2, 
    "name": "name", 
    "description": "description", 
    "version": "0.0.0.1", 
    "background": { 
    "scripts": ["background.js"] 
    }, 
    "permissions": [ 
    "tabs" 
    ], 
    "oauth2": { 
    "client_id": "<CLIENT_ID>.apps.googleusercontent.com", 
    "scopes": [ 
     "openid", "email", "profile" 
    ] 
    } 
} 

background.js:

// Using chrome.tabs 
var manifest = chrome.runtime.getManifest(); 

var clientId = encodeURIComponent(manifest.oauth2.client_id); 
var scopes = encodeURIComponent(manifest.oauth2.scopes.join(' ')); 
var redirectUri = encodeURIComponent('urn:ietf:wg:oauth:2.0:oob:auto'); 

var url = 'https://accounts.google.com/o/oauth2/auth' + 
      '?client_id=' + clientId + 
      '&response_type=id_token' + 
      '&access_type=offline' + 
      '&redirect_uri=' + redirectUri + 
      '&scope=' + scopes; 

var RESULT_PREFIX = ['Success', 'Denied', 'Error']; 
chrome.tabs.create({'url': 'about:blank'}, function(authenticationTab) { 
    chrome.tabs.onUpdated.addListener(function googleAuthorizationHook(tabId, changeInfo, tab) { 
     if (tabId === authenticationTab.id) { 
      var titleParts = tab.title.split(' ', 2); 

      var result = titleParts[0]; 
      if (titleParts.length == 2 && RESULT_PREFIX.indexOf(result) >= 0) { 
       chrome.tabs.onUpdated.removeListener(googleAuthorizationHook); 
       chrome.tabs.remove(tabId); 

       var response = titleParts[1]; 
       switch (result) { 
        case 'Success': 
         // Example: id_token=<YOUR_BELOVED_ID_TOKEN>&authuser=0&hd=<SOME.DOMAIN.PL>&session_state=<SESSION_SATE>&prompt=<PROMPT> 
         console.log(response); 
        break; 
        case 'Denied': 
         // Example: error_subtype=access_denied&error=immediate_failed 
         console.log(response); 
        break; 
        case 'Error': 
         // Example: 400 (OAuth2 Error)!!1 
         console.log(response); 
        break; 
       } 
      } 
     } 
    }); 

    chrome.tabs.update(authenticationTab.id, {'url': url}); 
}); 
+0

Xin chào Piotr. Tôi đã thử giải pháp của bạn nhưng tôi nhận được * Trang ủy quyền không thể được tải * lỗi. Tôi đang làm chính xác những gì bạn đang làm, với cùng phạm vi trong tệp kê khai. –

+0

Xin chào @Aegidius, bạn đã tìm ra điều này chưa? Tôi đang gặp vấn đề tương tự. Cảm ơn. – rsb

+0

@Aegidius, cùng ở đây, không chắc liệu phương pháp này vẫn hợp lệ? – seesoe

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