Pau*_*ine 4 python google-oauth
我使用的gdata-python-client访问谷歌域共享联系人API.
在企业应用程序中,您可能希望以编程方式访问用户数据,而无需他们进行任何手动授权.
有一个名为2LO(2脚OAuth)的协议,但似乎它与不推荐使用的OAuth1相关联:"重要:不推荐使用OAuth 1.0,并关闭新OAuth 1.0客户端的注册." 遍布Oauth1文档.
有一个新的基于OAuth2的" 域范围授权 "配方:
在Google Apps域中,域管理员可以向第三方应用程序授予对其用户数据的域范围内访问权限 - 这称为域范围的授权.要以这种方式委派权限,域管理员可以将服务帐户与OAuth 2.0一起使用.
这适用google-api-python-client但不适用gdata-python-client.
问题:有没有办法用Python实现这一目标?似乎来自gdata客户端的代码是史前的 - 是否有任何其他GAE运行时具有支持数据API委派的现代客户端库?
[更新]
如果我签署一个httplib2连接并调用Atom端点,我就可以检索该源.
http = httplib2.Http()
http = credentials.authorize(http)
resp, content = http.request(
'https://www.google.com/m8/feeds/contacts/default/full', 'GET'
)
Run Code Online (Sandbox Code Playgroud)
不幸的是gdata-python-client使用httplib而不是httplib2.
[解决了]
也许我错过了一些步骤,但在我们使用httplib2执行调用之前看起来令牌无效.我必须在运行[aeijdenberg]的答案中给出的样本之前运行上面的代码,否则我得到401.
以下是使用gdata库在Google App Engine中使用Python进行域范围委派的示例:
在"API&Auth"下启用您需要使用的API(此处不显示某些gdata API,如果是这样,请跳过此步骤).
在"API&Auth" - >"凭据"下,创建一个类型为服务帐户的新OAuth2客户端ID.记下电子邮件地址和客户端ID,并将下载的私钥保存到安全位置.
作为域管理员,请转到管理控制台(https://admin.google.com/AdminHome),导航到"安全" - >"高级设置" - >"托管第三方OAuth客户端访问".
将之前的完整客户端ID粘贴到"客户端名称"字段中,然后将API访问所需的范围粘贴到范围字段中.
由于我们在Google App Engine上运行,因此我们需要将PKCS12格式的私钥转换为PEM格式(因为目前部署在Google App Engine上的PyCrypto库不支持PCKS12):
cat secret-privatekey.p12 | openssl pkcs12 -nodes -nocerts -passin pass:notasecret | openssl rsa > secret-privatekey.pem
Run Code Online (Sandbox Code Playgroud)将此文件放在您的app目录中.
从https://code.google.com/p/google-api-python-client/downloads/list下载Google API Python客户端,然后选择google-api-python-client-gae-1.2.zip.
在您的app目录中解压缩:
unzip ~/Downloads/google-api-python-client-gae-1.2.zip
Run Code Online (Sandbox Code Playgroud)从https://code.google.com/p/gdata-python-client/downloads/list下载gdata python客户端,选择gdata-2.0.18.zip.
在您的app目录中安装它:
unzip ~/Downloads/gdata-2.0.18.zip
mv gdata-2.0.18/src/* .
rm -rf gdata-2.0.18/
Run Code Online (Sandbox Code Playgroud)确保PyCrypto安装在本地(但不在您的应用程序目录中):
sudo easy_install pycrypto
Run Code Online (Sandbox Code Playgroud)在你的app.yaml,将PyCrypto添加为库:
libraries:
- name: pycrypto
version: "2.6"
Run Code Online (Sandbox Code Playgroud)声明以下帮助器类:
import httplib2
class TokenFromOAuth2Creds:
def __init__(self, creds):
self.creds = creds
def modify_request(self, req):
if self.creds.access_token_expired or not self.creds.access_token:
self.creds.refresh(httplib2.Http())
self.creds.apply(req.headers)
Run Code Online (Sandbox Code Playgroud)使用私钥创建SignedJwtAssertionCredentials对象:
from oauth2client.client import SignedJwtAssertionCredentials
credentials = SignedJwtAssertionCredentials(
"<service account email>@developer.gserviceaccount.com",
file("secret-privatekey.pem", "rb").read(),
scope=["http://www.google.com/m8/feeds/"],
prn="<user to impersonate>@your-domain.com"
)
Run Code Online (Sandbox Code Playgroud)创建一个gdata客户端并使用它:
gd_client = gdata.contacts.client.ContactsClient('your-domain.com')
gd_client.auth_token = TokenFromOAuth2Creds(credentials)
xxx = gd_client.get_contacts()
Run Code Online (Sandbox Code Playgroud)