在已经编写 PHP 使用 google 的 PHP 客户端库进行身份验证之后,我来到这里寻找使用此解决方案的解决方案。正如您所提到的,我想共享存储的令牌,并且能够在不重新验证和/或触发弹出窗口的情况下使用 javascript(使用该.init(callback)
方法可能有解决方案,请参阅最后的文档/链接)。
是否有一些 gapi.auth.setToken(token) 方法
事实证明你可以,有setToken(token)
你提到的确切功能,你甚至可以共享之前在 PHP 中生成的身份验证令牌。我还不确定,我们是否应该这样做:)
我正在使用 PHP 进行初始身份验证,但大概在 javascript 客户端中,您可以以与本示例相同的方式调用setToken()
您存储的内容。getToken()
可能还有更好的方法,例如 API Authentication docs 中提到的 CORS(请参阅最后的链接),我还没有机会调查其中的任何一个,但是,我可以举一个例子来回答这个问题,并且可能对需要相同行为的其他人有用
我首先找到了 Google 开发人员 Dan Holevoet 的博客文章,其中包含一些示例 JS 代码。
http://googleappsdeveloper.blogspot.com.au/2011/12/using-new-js-library-to-unlock-power-of.html
能够直接使用 javascript 查询 API 并动态加载列表等非常棒,但让我担心的当然是将 clientid 等存储在 js 中。
// Snippet from Dan's post
var clientId = 'YOUR_CLIENT_ID';
var apiKey = 'YOUR_API_KEY';
var scopes = 'https://www.googleapis.com/auth/calendar';
function handleClientLoad() {
gapi.client.setApiKey(apiKey);
window.setTimeout(checkAuth,1);
checkAuth();
}
但是,根据丹对同一问题的回答:
apiKey 与指定的引用者一起使用,您必须在 API 控制台中声明。如果密钥是从未经授权的推荐人那里发送的,它将不起作用。您应该尽可能限制您接受的推荐人列表,以确保其他人不会将您的 apiKey 用于他们自己的请求。
现在,我的示例是针对日历 API 的,但它似乎也与其他 API 非常一致。
注意:此代码段仅用于概念验证,可能不应在生产中使用。我认为提到的推荐人保护可以做这样的事情,但需要考虑更多。它可以通过隐藏输入、AJAX 调用等来完成。但最终,它们都将在 javascript 中可见。
我为测试这个概念所做的是:
- 通过 PHP 客户端库进行身份验证,使用与回调相同的脚本/URL(有关这些回调,请参阅 [API 控制台][2])
- 在成功的身份验证中,在回调中,将页面中的全局 javascript 变量设置为存储的 PHP 身份验证令牌
- 加载页面后,在您第一次单击事件以使用 javascript(甚至在文档准备就绪时),调用
authMe()
以设置令牌
- 然后照常进行,调用您在初始 PHP 身份验证过程中指定范围的任何 javascript API 方法(在本例中
makeApiCall()
)
像这样:
在php回调例程中,不管是否已经认证(假设你的回调URL是同一个脚本),使这个var全局
<script type="text/javascript">
// A place to stick PHP's auth token once the auth dance is done
var dodgey_global_access_token = {};
</script>
现在,在 php 回调例程中,一旦我们检查了我们是否已通过身份验证,并且$_SESSION['token'] = $client->getAccessToken();
已被调用(IE 将身份验证令牌存储在某处以备后用),或者至少$client->getAccessToken()
有一些有意义的东西:
<script type="text/javascript">
// Set the js var via PHP here.. Yeck... Note json encode in php and parse in jquery
dodgey_global_access_token = $.parseJSON (<?php echo json_encode ($client->getAccessToken() ); ?>);
// dodgey_global_access_token now contains the auth token structure
// Removed auth-related functions in Dan's code - we'll already have a token
// Dan's orig function to list events in 'primary' calendar
function makeApiCall() {
gapi.client.load('calendar', 'v3', function() {
var request = gapi.client.calendar.events.list({
'calendarId': 'primary'
});
request.execute(function(resp) {
for (var i = 0; i < resp.items.length; i++) {
var li = document.createElement('li');
li.appendChild(document.createTextNode(resp.items[i].summary));
document.getElementById('events').appendChild(li);
}
});
});
}
// My function to setToken with the token injected from PHP authentication
function authMe () {
// Stuff the token into the gapi object
gapi.auth.setToken( dodgey_global_access_token );
// Now call the original 'makeAPICall' function now that we're 'authenticated'
makeApiCall();
}
</script>
注意:我在示例中使用了 jquery 来快速解析 JSON,我们已经在项目中使用它,但如果没有,您必须找到另一个库才能这样做
相关/有用的文档:
// Sorry, as a new poster I can only post 2 hyperlinks,
// so embedding this in code snippet
//
// http://code.google.com/p/google-api-javascript-client/wiki/ReferenceDocs#gapi
// http://code.google.com/p/google-api-javascript-client/wiki/Authentication
// http://code.google.com/p/google-api-javascript-client/issues/detail?id=22
// http://code.google.com/p/google-api-javascript-client/wiki/CORS
// https://code.google.com/apis/console
如果有任何不清楚的地方,请告诉我,并可以发布一个工作示例进行演示。