OAuth 2.0 应用实现

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

开放云支持 OAuth 2.0 授权流程,无论是否使用 PKCE,取决于您的客户是否为公开或私人。

  • 机密客户端是能够保持客户端密钥机密的应用,例如可以在其端后端安全存储和检索秘密的网站。
  • 公共客户端是应用程序,它们无法保守秘密,例如移动和网页浏览器应用程序。

我们推荐使用 PKCE 为客户端提供身份认证,需要为客户端 所有 客户端。

要实现授权代码流程,您的应用执行以下步骤:

  1. 生成一个代码验证器和代码挑战(仅限 PKCE)。这允许您在请求中包含挑战而不是客户端秘密,从而提高安全。
  2. 发送一个 GET 请求到授权端口,并且提供适当的参数。
  3. 处理授权回调。 获得授权后,使用 Roblox 在转向请求中提供的授权代码到您指定的 URL 进行转向。 处理授权代码以获取后续使用。
  4. 发送一个 POST 请求到代币端口,并使用授权代验证码获取访问权限。如果成功,你将收到使用 API 调用的代币更新。
  5. 调用您想要访1) 使用权 2)通行证 3)访问权限的资源的 OAuth 2.0 认证 API 的任何开放云 API。

下面的部分描述了每个步骤在更大的深度。

生成代码挑战(仅对 PKCE 有效)

在启动授权过程之前,您需要从代码验证器生成一个代码挑战。您可以使用库存或程序语言的库库存函数在您选择的编程语言中创建代码验证器,计算哈希,并执行 Base64 编码生成代码挑战。

创建代码验证器时,只能使用不保留的字符,包括大小写字母(A-Z,a-z)、十六进制数字(0-9、hyphen (-、期间 (。)、underior (.)、角号(_)和尾号(~),最小为 43 个字符,最大为 128 个字符。

下面的例子显示了如何使用 Javascript 创建代码验证器并使用 SHA-256 加密算法生成代码挑战:

Generate Code Challenge

const crypto = require('crypto');
// base64URL encode the verifier and challenge
function base64URLEncode(str) {
return str.toString('base64')
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=/g, '');
}
// create sha256 hash from code verifier
function sha256(buffer) {
return crypto.createHash('sha256').update(buffer).digest(`base64`);
// create a random code verifier
var code_verifier = base64URLEncode(crypto.randomBytes(32));
// generate a challenge from the code verifier
var code_challenge = base64URLEncode(sha256(code_verifier));

对于 PKCE,您需要先前步骤中的代码验证器和挑战值。

构建授权 URL

要启动用户权限设置过程,请使用以下参数构建一个权限 URL:

  • client_id : 您的App用程序客户ID在 注册您的应用程序 后获得。
  • redirect_uri:您的AppApp的重新入口点。
  • scope : 您请求的范围,定义您的应用程序在空格分开列表中需要的访问权限。
  • response_type : 将其设置为 code 来表示授权代码流。 仅限 PKCE 需要
  • code_challenge : 代码挑战生成自代码验证器。
  • code_challenge_method : 将此参数值设置为 S256 ,表示代码挑战使用了 SHA-256 算法,是最常用的安全代码挑战方法。
  • state : 一个不透明的随机值,可以在请求和回调之间保持状态。 仅限于非 PKCE 的情况下需要
  • client_secret : 您的App用的客户端秘密在注册您的应用后得到。如果您使用 PKCE 验证,请略过此参数。您的授权请求 URL 必须是以下示例中所示的样式:
示例 PKCE 授权 URL

https://apis.roblox.com/oauth/v1/authorize?client_id=7290610391231237934964
&code_challenge=PLEKKVCjdD1V_07wOKlAm7P02NC-LZ_1hQfdu5XSXEI
&code_challenge_method=S256
&redirect_uri=https://example.com/redirect
&scope=openid%20profile
&response_type=code
&state=abc123

当用户访问 URL 时,他们通过授权流程。如果成功,Roblox 将用户重新定向到指定的 redirect_uri

处理权限调用回调

当授权流程成功时,您的应用从 Roblox 授权服务器上获得一个 GET 请求,该请求您指定的 redirect_uri 中。在请求中,您收到了 code (授权代验证码) 和 1> state1> (如果您之前提供了值) 参数。

  • code 参数包含可以从授权服务器交换的访问代币的授权代码。大多数端后服务器语言都有标准的方法来访问查询参数作为装置对象。您需要获得 code 参数,并使用它来交换访问代币。

  • state 参数是您在授权请求中提供的不透明值。您可以使用此参数来保持授权过程的状态或上下文。

例如,如果您指定您的重置 URL 为 https://example.com/redirect,您可以收到一个 GET 请求,该请求的 URL 为 1> GET1> 。

示例红色网址

https://example.com/redirect?code=10c45PNuquKnFJ6pUcy5-fHkghEM6lSegm-7hj9mVEprub1dSDuStuKK_EAUXY7AHTD63xcnmvxSLthp-C8g3jzIGZVzuXSd20Y2dEYI9hx0LZmPg95ME4z2K03UheiZbroyXUjYyB3ReoMqobzDVPzyx6IS8kj2Uu-11Xq_0JiTYxtDatuqXRNIAmJT8gMJmbSyOLOP_vnDvbeMUiBsqCRrkTGVbWSwYSc8sTVVE-535kYdqQOgNjH1ffCoZLGl8YYxLnpb2CXJlRQPrcjkA&state=6789

如果授权失败,您的应用程序收到一个 GET 请求,这是指定的重新向导 URL 使用 error (如果适用)参数。

  • error 参数表示在授权过程中发生的特定 OAuth 2.0 错误。
  • error_description 参数提供有关错误的额外细节。
  • state 参数可以帮助您的应用程序在发生错误时保持状态。

使用权限代码交换访问代币

当您分析完授权 code 后,用代币交换访问所需 Roblox 资源的权限:

  1. 请求一个访问 token 和刷新 token 通过发送一个 POST 请求到 代币交换端口 。请求必须包含授权代验证码、客户ID 和代码验证值 (PKCE) 或客户秘密 (非 PKCE) 在 x-www-form-urlencoded 格式。

  2. 解析从响应中收到的适用代币。访问代币有效期为 15 分钟。请在服务器端安全存储刷新代币,以便在将来获得新代币。

    示例代币端点响应

    {
    "access_token": "eyJhbGciOiJFUzI1NiIsImtpZCI6IlBOeHhpb2JFNE8zbGhQUUlUZG9QQ3FCTE81amh3aXZFS1pHOWhfTGJNOWMiLCJ0eXAiOiJKV11234.eyJzdWIiOiIyMDY3MjQzOTU5IiwiYWlkIjoiM2Q2MWU3NDctM2ExNS00NTE4LWJiNDEtMWU3M2VhNDUyZWIwIiwic2NvcGUiOiJvcGVuaWQ6cmVhZCBwcm9maWxlOnJlYWQiLCJqdGkiOiJBVC5QbmFWVHpJU3k2YkI5TG5QYnZpTCIsIm5iZiI6MTY5MTYzOTY5OCwiZXhwIjoxNjkxNjQwNTk4LCJpYXQiOjE2OTE2Mzk2OTgsImlzcyI6Imh0dHBzOi8vYXBpcy5yb2Jsb3guY29tL29hdXRoLyIsImF1ZCI6IjcyOTA2MTAzOTc5ODc5MzQ5Nj1234.BjwMkC8Q5a_iP1Q5Th8FrS7ntioAollv_zW9mprF1ats9CD2axCvupZydVzYphzQ8TawunnYXp0Xe8k0t8ithg",
    "refresh_token": "eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwia2lkIjoidGpHd1BHaURDWkprZEZkREg1dFZ5emVzRWQyQ0o1NDgtUi1Ya1J1TTBBRSIsInR5cCI6IkpXVCJ9..nKYZvjvXH6msDG8Udluuuw.PwP-_HJIjrgYdY-gMR0Q3cabNwIbmItcMEQHx5r7qStVVa5l4CbrKwJvjY-w9xZ9VFb6P70WmXndNifnio5BPZmivW5QkJgv5_sxLoCwsqB1bmEkz2nFF4ANLzQLCQMvQwgXHPMfCK-lclpVEwnHk4kemrCFOvfuH4qJ1V0Q0j0WjsSU026M67zMaFrrhSKwQh-SzhmXejhKJOjhNfY9hAmeS-LsLLdszAq_JyN7fIvZl1fWDnER_CeDAbQDj5K5ECNOHAQ3RemQ2dADVlc07VEt2KpSqUlHlq3rcaIcNRHCue4GfbCc1lZwQsALbM1aSIzF68klXs1Cj_ZmXxOSOyHxwmbQCHwY7aa16f3VEJzCYa6m0m5U_oHy84iQzsC-_JvBaeFCachrLWmFY818S-nH5fCIORdYgc4s7Fj5HdULnnVwiKeQLKSaYsfneHtqwOc_ux2QYv6Cv6Xn04tkB2TEsuZ7dFwPI-Hw2O30vCzLTcZ-Fl08ER0J0hhq4ep7B641IOnPpMZ1m0gpJJRPbHX_ooqHol9zHZ0gcLKMdYy1wUgsmn_nK_THK3m0RmENXNtepyLw_tSd5vqqIWZ5NFglKSqVnbomEkxneEJRgoFhBGMZiR-3FXMaVryUjq-N.Q_t4NGxTUSMsLVEppkTu0Q6rwt2rKJfFGuvy3s12345",
    "token_type": "Bearer",
    "expires_in": 899,
    "id_token": "eyJhbGciOiJFUzI1NiIsImtpZCI6IkNWWDU1Mi1zeWh4Y1VGdW5vNktScmtReFB1eW15YTRQVllodWdsd3hnNzgiLCJ0eXAiOiJKV11234.eyJzdWIiOiIyMDY3MjQzOTU5IiwibmFtZSI6ImxpbmtzZ29hdCIsIm5pY2tuYW1lIjoibGlua3Nnb2F0IiwicHJlZmVycmVkX3VzZXJuYW1lIjoibGlua3Nnb2F0IiwiY3JlYXRlZF9hdCI6MTYwNzM1NDIzMiwicHJvZmlsZSI6Imh0dHBzOi8vd3d3LnJvYmxveC5jb20vdXNlcnMvMjA2NzI0Mzk1OS9wcm9maWxlIiwibm9uY2UiOiIxMjM0NSIsImp0aSI6IklELnltd3ZjTUdpOVg4azkyNm9qd1I5IiwibmJmIjoxNjkxNjM5Njk4LCJleHAiOjE2OTE2NzU2OTgsImlhdCI6MTY5MTYzOTY5OCwiaXNzIjoiaHR0cHM6Ly9hcGlzLnJvYmxveC5jb20vb2F1dGgvIiwiYXVkIjoiNzI5MDYxMDM5Nzk4NzkzNDk2NCJ9.kZgCMJQGsariwCi8HqsUadUBMM8ZOmf_IPDoWyQY9gVX4Kx3PubDz-Q6MvZ9eU5spNFz0-PEH-G2WSvq2ljDyg",
    "scope": "openid profile"
    }

调用资源方法

现在您已经拥有必要的访问代币,您可以使用它来作为资源方法的认证调用。包括访问代币在所有 API 请求的头部,以授权它们。

例如,您可以通过测试您的应用程序是否正确地运行通过查看整个授权流程,然后使用访问代币对GET请求,来到用户信息端口。请确保您有openid或两个2> openid2>和5> 个人资料rofile5>

示例用户信息回应

{
"sub": "12345678",
"name": "Jane Doe",
"nickname": "robloxjanedoe",
"preferred_username": "robloxjanedoe",
"created_at": 1607354232,
"profile": "https://www.roblox.com/用户/12345678/个人资料”
}