如何在PHP中从GoToWebinar的API中检索该Auth令牌?

v64noz0r  于 2022-10-08  发布在  PHP
关注(0)|答案(2)|浏览(190)

GTW已经更新了他们的API,我正在重构一些代码以适应这些必需的更改,但我在身份验证令牌部分遇到了一些困难。

根据他们的指示(https://goto-developer.logmeininc.com/how-get-access-token-and-organizer-key):
1-请求授权码代表GoTo产品用户创建授权请求。它会将它们发送到产品登录页面。

在My Apps页面中,打开您的应用程序并复制Consumer密钥值。将Consumer密钥值插入到以下URL中以替换{Consumer erKey}:https://api.getgo.com/oauth/v2/authorize?client_id={Consumer erKey}&Response_type=code产品账户持有人发送该URL。他们被定向到产品的登录页面。如果他们尚未登录,则使用其凭据登录,并且必须单击允许才能访问开发人员应用程序。然后,用户被自动重定向到您在开发人员中心应用程序中定义的重定向URL。重定向URI(在浏览器地址栏中)添加了一个响应键。

重要提示:您可能会在页面上看到错误,如404 Not Found。这不是问题。查看浏览器中的URL。它包含下一步所需的ResponseKey。它看起来类似于:

http://example.com/oauthreturn/?code={响应密钥}您可以包括可选的重定向URI和/或状态参数。有关详细信息,请参阅下面的可选部分:添加重定向URI。

这里最有趣的是这句话:

重要提示:您可能会在页面上看到错误,如404 Not Found。这不是问题。查看浏览器中的URL。它包含下一步所需的ResponseKey。它看起来类似于:

如果我在浏览器中这样做,它实际上工作得很好……我提供了适当的凭据,我被重定向到一个相当于错误页面的页面(返回了头代码404),但URL包含auth令牌。

我试图使用cURL检索该auth令牌,但实际上无法在cURL请求返回的任何数据中获得重定向的URL。

sg2wtvxw

sg2wtvxw1#

如果您更愿意自己处理身份验证过程,请查看此repo中的实现:

https://github.com/cleverreach/citrix

  • 它基于teodortalov/Citrix实现,但更新为GTW API的v2版本。

由于该包处理整个过程,我建议按原样使用它,但如果您更喜欢实现自己的,它仍然是一个很好的例子和有用的起点。

v2g6jxz6

v2g6jxz62#

我刚刚经历了整个过程,但它应该是这样运作的。我知道Goto Connect上提供的API文档有点令人困惑!

更好的文档可以在here找到

该工作流包括三个主要步骤:

1.**使用认证码授权流程初始化认证流以获取授权码。**在这里,您将使用您的客户端ID调用认证API,您将被定向到一个浏览器窗口,在那里您将提供认证,并使用OAuth返回{AUTHORIZATION CODE}

import http.client

conn = http.client.HTTPSConnection("authentication.logmeininc.com")

conn.request("GET", "/oauth/authorize?response_type=code&client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URL)

res = conn.getresponse()
data = res.read()
res.getheaders()

res.getheaders()应返回如下所示的Headers对象(要访问以完成OAuth的URL位于Location标题中):

[('Date', 'Fri, 23 Sep 2022 23:13:48 GMT'),
 ('Content-Length', '0'),
 ('Connection', 'keep-alive'),
 ('Set-Cookie',
  'csrftoken=; Max-Age=0; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/'),
 ('Location',
  'https://authentication.logmeininc.com/login?service=xxxxxxxxxxxxxx'),
 ('Content-Language', 'en')]

此部分不是程序性的,需要用户在浏览器窗口中进行干预。完成身份验证流程后,您将被定向到您的{REDIRECT URI}以及作为参数标记的新授权码:https://yourredirecturi.com/?CODE=XXXXXXXXXXXXX

1.**使用相同的接口,但传递不同的参数(这里的auth编码为Base64 (base64("{CLIENT_ID}:{CLIENT_SECRET}"))**使用相同的接口交换访问令牌来获取初始访问令牌:

import json

code = YOURAUTHORIZATION_CODE_FROM_STEP1
conn = http.client.HTTPSConnection("authentication.logmeininc.com")
payload = "grant_type=authorization_code&code=" + code + "&redirect_uri=YOUR_REDIRECT_URI&client_id=YOUR_CLIENT_ID"

headers = {
    'Authorization': "Basic " + auth,
    'content-type': "application/x-www-form-urlencoded",
    'Accept' : "application/json"
    }

conn.request("POST", "/oauth/token", payload, headers)

res = conn.getresponse()
data = res.read()

returned = data.decode("utf-8")
returned_json = json.loads(returned)
access_token = returned_json["access_token"]
refresh_token = returned_json["refresh_token"]

这应该返回access_tokenrefresh_token

1.**定期检索新的刷新令牌。**一旦建立了身份验证,您可以通过调用相同的API,但通过将grant_type参数从authorization_code更改为refresh_token,以编程方式请求刷新令牌(我每天都会使用Python脚本执行此操作

import http.client
import json

code = YOURAUTHORIZATION_CODE_FROM_STEP1
conn = http.client.HTTPSConnection("authentication.logmeininc.com")
payload = "grant_type=refresh_token&refresh_token=" + refresh_token

headers = {
    'Authorization': "Basic " + auth,
    'content-type': "application/x-www-form-urlencoded",
    'Accept' : "application/json"
    }

conn.request("POST", "/oauth/token", payload, headers)

res = conn.getresponse()
data = res.read()

returned = data.decode("utf-8")
returned_json = json.loads(returned)
access_token = returned_json["access_token"]
try :
  refresh_token = returned_json["refresh_token"]
except :
  refresh_token = refresh_token

最终想法

为了简单起见,我手动完成了步骤1和步骤2。我每晚使用Chron作业在Google Cloud功能上以服务的形式运行步骤3,并将它们存储在Google Secrets Manager中,以确保我拥有最新的access_tokenrefresh_token

希望这能帮上忙!

相关问题