我正在开发一个 Discord 机器人,该机器人应该通过 Canvas LMS API 返回, 用户课程列表、作业通知等。最简单的方法可能是要求用户提供他们的画布身份验证令牌通过机器人,但这显然违反了谁知道有多少服务条款 lmao。
我对 OAuth2 工作流程有些熟悉,但对如何使用不和谐机器人作为我的应用程序和画布类详细信息作为我的受保护资源来实现一个工作流程感到非常困惑。我也对如何在没有用户或 Web 界面的情况下实现 OAuth2 工作流程感到困惑,因为不和谐的机器人更像是 CLI 类型的东西。当没有用于身份验证过程的 Web 界面或网站时,对于画布的 redirect_uri 也非常困惑。
使用此端点尝试 Canvas GET 请求来尝试 OAuth2 工作流程:
https:///login/oauth2/auth?client_id=XXX&response_type=code&redirect_uri=https://example.com/oauth_complete&state=YYY&scope=
不确定要为 client_id 添加什么内容,因为画布只能让我创建访问令牌。由于我的应用程序不是基于网络的,所以也对redirect_uri 的内容感到困惑。
非常感谢任何帮助。谢谢!
因此,您需要做的第一件事是生成
client_id
和 secret
值。 Canvas LMS 的文档中写道:
要获取这些应用程序凭据,您需要注册您的应用程序。 (...) 对于 Canvas Cloud(由 Instruct 托管),开发人员密钥由机构管理员颁发。 (...) 对于开源 Canvas 用户,您可以在 Canvas 安装的站点管理帐户中生成客户端 ID 和密码。
如果您的场景符合后面的描述(开源用法),那么这里有一个关于如何生成它们的简单指南。您也可以在此处设置您将使用的有效重定向 URI。
完成此操作后,您的 Discord 机器人将向
发出
GET HTTPS
请求
https://<canvas-install-url>/login/oauth2/auth?client_id={client_id}&response_type=code&state={state}&redirect_uri={redirect_uri}
地点:
{client_id}
是您刚刚生成的值。{state}
是一个应充当身份验证用户的唯一标识符的值,因为它将作为 redirect_uri
的查询参数发送回给您,因此您可以将您将在应用程序上收到的请求链接到正在认证的用户。例如,您可以在此处使用生成的 UUID。用户成功进行身份验证后,将使用
redirect_uri
和 code
查询参数将请求发送到提供的 state
值。
您的应用程序不需要 Web 界面来处理此请求,但它必须至少为可以发送请求的 Web 服务器提供服务。
您可以使用express
或任何其他 Web 服务器框架(例如
koa
、
fastify
甚至节点的
http
库)直接在 Discord 机器人的应用程序中提供 Web 服务器服务。收到请求后,您的应用程序应将
code
值与实际的
access_token
进行交换。这可以通过向
发出
POST HTTPS
请求来完成
https://<canvas-install-url>/login/oauth2/token?grant_type=authorization_code&client_id={client_id}&client_secret={client_secret}&redirect_uri={redirect_uri}&code={code}
请注意,必须提供与先前请求中使用的相同的 redirect_uri
值。Canvas 的服务器将响应(示例):
{
"access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
"token_type": "Bearer",
"user": {"id":42, "name": "Jimi Hendrix"},
"refresh_token": "tIh2YBWGiC0GgGRglT9Ylwv2MnTvy8csfGyfK2PqZmkFYYqYZ0wui4tzI7uBwnN2",
"expires_in": 3600,
"canvas_region": "us-east-1"
}
从这里您可以保存链接到用户的 Discord 帐户的令牌,并根据需要向 API 发出请求。