2017-02-09 108 views
1

我想實現一個谷歌oauth 2.0登錄,而不使用任何庫在我的Node.js應用程序。如何使用Google登錄?

我在Google API控制檯上創建了一個應用程序,重定向網址爲http://localhost:3000。在登錄期間,我的response_typecode,它返回一次性使用代碼,需要使用描述here所述的token_endpoint進行交換。 交換是在我的node.js服務器上用下面的代碼完成的。

axios({ 
 
    url: 'https://www.googleapis.com/oauth2/v4/token', 
 
    method: 'post', 
 
    data: { 
 
     code: code, 
 
     client_id: sso.clientId, 
 
     client_secret: sso.clientSecret, 
 
     redirect_uri: sso.redirect_uri, 
 
     grant_type: 'authorization_code', 
 
    } 
 
    }) 
 
    .then((response) => { 
 
    console.log(response.data); 
 
    }) 
 
    .catch(function(err) { 
 
    console.log(err.response.data); 
 
    });
但是,這是給我回的

{ 
    "error": "unsupported_grant_type", 
    "error_description": "Invalid grant_type: " 
} 

,而不是用戶標記的錯誤響應。

請幫我確定問題。

我試着做POSTMAN查詢以及raw中的相同有效負載,其內容類型設置爲application/json,它給了我同樣的錯誤。

+0

您能否確認您的POST請求中的其他字段,例如'client_id,client_secret,redirect_uri'是否正確? –

+0

是的。當我登錄以獲取「代碼」時,相同的信用正在工作。 – jagzviruz

回答

-1

你需要的地方使用paramsdata的同時使通過愛可信的交換電話,修訂塊會像

params: { 
    code: code, 
    client_id: sso.clientId, 
    client_secret: sso.clientSecret, 
    redirect_uri: sso.redirect_uri, 
    grant_type: 'authorization_code', 
} 

希望這有助於!

+0

工作!非常感謝。谷歌文檔說 '請求必須包括在POST正文中的以下參數:',因此我正在使用'數據'.. – jagzviruz

+0

很高興它的工作! :-) –

+0

Downvoter ..請說明理由? –

0

從不在GET參數中包含像clientSecret這樣的東西。這可能會導致嚴重的安全問題!

google doc很清楚如何發送data;

作爲POST體 - 在OAuth2一如既往: https://developers.google.com/identity/protocols/OAuth2WebServer - 步驟5,REST代碼示例

它們必須被髮送作爲字符串,但在POST體/ data

的字符串與urlencoded參數如

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7& 
client_id=your_client_id& 
client_secret=your_client_secret& 
redirect_uri=https://yourOauth2redirectUrl.example.com/code& 
grant_type=authorization_code 
+0

即使我的代碼在服務器上運行,而不是在瀏覽器中,這是一個問題嗎? – jagzviruz

+0

這取決於你的服務器。 TLS(SSL)是唯一的安全層。每當SSL出現問題(例如,您忘記更新證書)時,您遇到問題。對於OAuth安全性,有三件重要的事情:•嚴格遵循規範•正確使用TLS•使用狀態參數 - BTW:我寫了indieauth-node,將在週末發佈:https://github.com/redaktor/ - 它還包含OAuth1和OAuth2模塊(與Google完美合作)...隨意在此處詢問更多問題... – sebilasse