2011-10-30 79 views
35

對不起,一個大的編輯。我開始了,因爲我沒有正確說明我的問題。如何通過OAuth 2.0在Google瀏覽器中向Google進行身份驗證?

我想在HTML5中編寫客戶端應用程序。我不希望它被託管在網站上。我甚至不確定這是可能的,我對這種類型的應用程序相當陌生。

無論如何,我想訪問Google服務,這需要驗證身份,如OAuth。因爲它是JavaScript,聽起來像OAuth2是我需要的。

我試圖打開彈出式窗口中的Google身份驗證(我有這部分),讓用戶允許訪問,然後將流量傳回我的應用程序,然後可以查詢Google服務。問題是1.它會要求用戶在使用response_type=code時將複製/粘貼令牌到應用程序中,但如果我使用response_type=token,它需要我重定向回有效的URL,因爲該URL不在Web服務器上託管,沒有。

那麼,我該如何使用OAuth,並讓用戶無縫授予訪問權限呢?

+0

檢查這個答案http://stackoverflow.com/a/38094113/1153703 –

回答

53

你應該有谷歌定義了一些重定向URL重定向到認證完成後。如果您無法在任何網站上託管您的網頁,則可以很好地將其託管在本地主機中。

關於從彈出窗口獲取訪問令牌到主父窗口,您可以在父窗口中設置一個計時器,該計時器會繼續檢查彈出窗口的文檔位置。一旦文檔位置與重定向URL匹配,您就可以解析訪問令牌,該訪問令牌將位於URL本身中。

我寫了完全相同的問題(使用本地主機)昨天的教程,這裏是鏈接: http://www.gethugames.in/2012/04/authentication-and-authorization-for-google-apis-in-javascript-popup-window-tutorial.html

希望你會發現它是有用的。

+0

我讀過你的教程,我想知道是否可以按照你的建議獲得令牌,並且一旦令牌存儲在父窗口中,就使用php來進行API調用。我想這樣做的原因是,我使用的是google-api-php-client庫。謝謝 – IberoMedia

+0

我相信在google-api-php庫中會有功能來授權和獲取訪問令牌。爲什麼不能使用它們? http://code.google.com/p/google-api-php-client/wiki/OAuth2 – saiy2k

+0

因爲我試圖執行一系列的表單或過程。如果訪問令牌或刷新令牌不可用,則用戶需要授權訪問日曆和電子表格,在進程的每個階段進行b/c訪問,或者在提交表單(多部分表單進程)之後記錄時間流逝並在日曆和電子表格中形成數據。使用php庫的問題是它會打開到同一頁面,並且我沒有辦法從第一個啓動過程窗體返回POST。 – IberoMedia

11

爲避免潛在click jacking,Google身份驗證強制您轉到完整頁面登錄。我認爲你不能控制這一點。

編輯評論後,這裏是從做它的Google OAuth2 page提取的代碼:

<body> 
    <a href="javascript:poptastic('https://accounts.google.com/o/oauth2/auth?scope=https://www.google.com/m8/feeds&client_id=21302922996.apps.googleusercontent.com&redirect_uri=https://www.example.com/back&response_type=token');">Try 
    out that example URL now</a> 
<script> 
    function poptastic(url) { 
     var newWindow = window.open(url, 'name', 'height=600,width=450'); 
     if (window.focus) { 
     newWindow.focus(); 
     } 
    } 

</script> 
</body> 
+2

我不知道這是真的。在他們自己的示例網頁http://code.google.com/apis/accounts/docs/OAuth2.html#ClientLibraries上,有一個鏈接顯示「現在嘗試一個示例網址」,如果點擊該鏈接,則會打開一個新的彈出窗口。 – esac

+0

我已經更新了答案。我試圖將它嵌入到iframe中,這可能是重定向頁面的原因。感謝您的信息。 – Mic

+0

對不起,我已經能夠得到那部分。該窗口打開,但它希望你複製/粘貼一些認證令牌到我不想要的客戶端應用程序中。我希望用戶點擊「允許」,然後繼續。這是我無法弄清的部分。 – esac

2

我相信你可以在Javascript中使用google api(gapi)for Oauth。 下面是文檔:Authentication using the Google APIs Client Library for JavaScript

你會不會要求用戶複製/粘貼任何代碼,你將不需要提供重定向URI

所有你需要做的是:在Google Developers Console轉到您的項目並生成以下內容: 1.生成新的客戶端ID並選擇選項「已安裝的應用程序」和「其他」。 2。生成一個公共的API密鑰

示例代碼從上面的文檔:

// Set the required information 
var clientId = 'YOUR CLIENT ID'; 
var apiKey = 'YOUR API KEY'; 
var scopes = 'https://www.googleapis.com/auth/plus.me'; 

// call the checkAuth method to begin authorization 
function handleClientLoad() { 
    gapi.client.setApiKey(apiKey); // api key goes here 
    window.setTimeout(checkAuth,1); 
} 

// checkAuth calls the gapi authorize method with required parameters 
function checkAuth() { 
    gapi.auth.authorize({client_id: clientId, scope: scopes, immediate: true}, handleAuthResult); // scope and client id go here 
} 

// check that there is no error and makeApi call 
function handleAuthResult(authResult) { 
    var authorizeButton = document.getElementById('authorize-button'); 
    if (authResult && !authResult.error) { 
    makeApiCall(); 
    } 
} 

// API call can be made like this: 
function makeApiCall() { 
    gapi.client.load('plus', 'v1', function() { 
    var request = gapi.client.plus.people.get({ 
     'userId': 'me' 
    }); 
    request.execute(function(resp) { 
     var heading = document.createElement('h4'); 
     var image = document.createElement('img'); 
     image.src = resp.image.url; 
     heading.appendChild(image); 
     heading.appendChild(document.createTextNode(resp.displayName)); 

     document.getElementById('content').appendChild(heading); 
    }); 
    }); 
} 
相關問題