我正在建立一个人们可以通过身份验证来阅读他们的Gmail的系统。我在Python上使用OAuth2在我的网站上运行得非常好;在谷歌的回复中,我得到access_token
,token_type
,expires_in
和(最重要的)refresh_token
。
我现在希望在Javascript中使用相同的工具(对于我使用Ionic构建的应用程序)。所以我使用ngCordovaOauth使用以下代码进行身份验证:
$cordovaOauth.google(
'xxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
['https://www.googleapis.com/auth/userinfo.email', 'https://www.googleapis.com/auth/gmail.readonly'],
{
'access_type': 'offline',
'approval_prompt': 'force'
}
)
.then(function(result){
console.log("Response object -> " + JSON.stringify(result));
}, function(error){
console.log('Error -> ' + error);
});
正如预期的那样,这会在我的手机上生成以下屏幕:
但是在json我回来的时候没有refresh_token
:
{"access_token":"xxxx.xxxxxxxxxxxx","token_type":"Bearer","expires_in":"3599"}
有人知道为什么我在使用Javascript api时没有获得refesh_token
?欢迎所有提示!
答案 0 :(得分:0)
CordovaOauth正在使用OAuth 2.0的Implicit grant type,该规范适用于“使用JavaScript等脚本语言在浏览器中实现的客户端”。通过此流程,客户端将直接发出一个访问令牌,并且只有那个。
在Authorization Code grant type中,客户端会获得一个授权代码,然后它会为Access和Refresh Tokens进行交换,但这也包括客户端本身的身份验证,这就是为什么它在Server-to中完成的原因。 - 服务器方式。您不希望在面向最终用户的JavaScript代码中公开您的client_id / client_secret。
请同时查看解释不同情况的Google Documentation。
答案 1 :(得分:0)
为什么您不能使用Cordova / Ionic / Angular请求刷新令牌? ...
我有一个获取刷新令牌,访问令牌等的应用程序。因此我使用了这段代码:
apiKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
clientID = 'xxxxxxxxxxxxxxxxxxxxxxxxxx2ivu3.apps.googleusercontent.com';
var notiID = 0;
var googleapi = {
authorize: function(options) {
var deferred = $.Deferred();
var authUrl = 'https://accounts.google.com/o/oauth2/auth?' + $.param({
client_id: options.client_id,
redirect_uri: options.redirect_uri,
response_type: 'code',
scope: options.scope
});
var authWindow = window.open(authUrl, '_blank', 'location=yes');
$(authWindow).on('loadstart', function(e) {
var url = e.originalEvent.url;
var code = /\?code=(.+)$/.exec(url);
var error = /\?error=(.+)$/.exec(url);
if (code || error) {
//Always close the browser when match is found
authWindow.close();
loadingSpinner();
}
if (code) {
$.post('https://accounts.google.com/o/oauth2/token', {
code: code[1],
client_id: options.client_id,
client_secret: options.client_secret,
redirect_uri: options.redirect_uri,
grant_type: 'authorization_code'
}).done(function(data) {
deferred.resolve(data);
$("#loginStatus").html('Name: ' + data.given_name);
}).fail(function(response) {
deferred.reject(response.responseJSON);
});
} else if (error) {
deferred.reject({
error: error[1]
});
}
});
return deferred.promise();
}
};
这个用于请求访问和刷新令牌:
function callGoogle()
{
// alert('starting');
googleapi.authorize({
client_id: clientID,
client_secret: apiKey,
redirect_uri: 'http://localhost',
scope: 'https://www.googleapis.com/auth/analytics.readonly'
}).done(function(data) {
localStorage.accessToken=data.access_token;
localStorage.refreshToken=data.refresh_token;
// console.log(JSON.stringify(data));
// console.log(localStorage.accessToken);
// console.log(localStorage.refreshToken);
getDataProfile();
});
}
尝试一下,让我知道,你需要进一步的帮助。您只需要inappbrowser和console插件。当然还有jQuery。