Loại liên kết OAuth hỗ trợ 2 quy trình OAuth 2.0 tiêu chuẩn ngành, đó là quy trình ngầm định và quy trình mã uỷ quyền.
In the implicit code flow, Google opens your authorization endpoint in the user's browser. After successful sign in, you return a long-lived access token to Google. This access token is now included in every request sent from the Assistant to your Action.
In the authorization code flow, you need two endpoints:
- The authorization endpoint, which is responsible for presenting the sign-in UI to your users that aren't already signed in and recording consent to the requested access in the form of a short-lived authorization code.
- The token exchange endpoint, which is responsible for two types of exchanges:
- Exchanges an authorization code for a long-lived refresh token and a short-lived access token. This exchange happens when the user goes through the account linking flow.
- Exchanges a long-lived refresh token for a short-lived access token. This exchange happens when Google needs a new access token because the one it had expired.
Although the implicit code flow is simpler to implement, Google recommends that access tokens issued using the implicit flow never expire, because using token expiration with the implicit flow forces the user to link their account again. If you need token expiration for security reasons, you should strongly consider using the auth code flow instead.
Triển khai tính năng liên kết tài khoản OAuth
Định cấu hình dự án
Để định cấu hình dự án sử dụng tính năng liên kết bằng OAuth, hãy làm theo các bước sau:
- Mở Actions Console rồi chọn dự án mà bạn muốn sử dụng.
- Nhấp vào thẻ Phát triển rồi chọn Liên kết tài khoản.
- Bật nút chuyển bên cạnh mục Liên kết tài khoản.
- Trong phần Tạo tài khoản, hãy chọn Không, tôi chỉ muốn cho phép tạo tài khoản trên trang web của mình.
Trong Loại liên kết, hãy chọn OAuth và Mã uỷ quyền.
Trong phần Thông tin khách hàng:
- Chỉ định một giá trị cho Mã khách hàng do Actions on Google cấp để xác định các yêu cầu đến từ Google.
- Ghi lại giá trị của Mã ứng dụng do Google cấp cho Hành động của bạn;
- Chèn URL cho các điểm cuối Uỷ quyền và Trao đổi mã thông báo.
- Nhấp vào Lưu.
Triển khai máy chủ OAuth
授权代码流程的 OAuth 2.0 服务器实现包括 两个端点,您的服务会通过 HTTPS 提供这两个端点。第一个端点 是授权端点,负责查找或获取 就数据访问征求用户意见。授权端点显示登录 尚未登录的用户的界面,并记录同意 请求的访问权限。第二个端点是令牌交换端点, 用于获取名为令牌(用于向 Action 用户授权)的加密字符串 以访问您的服务。
当您的 Action 需要调用您的某项服务的 API 时,Google 会使用这些 API 端点一起获取用户许可,以便在他们的 。
Google 发起的 OAuth 2.0 身份验证代码流程会话包含以下流程:
- Google 会在用户的浏览器中打开您的授权端点。如果流 用户通过纯语音设备启动 Action,Google 会将 将代码执行到手机上
用户登录(如果尚未登录)并授予 Google 以下权限: 通过您的 API 访问其数据。
您的服务会创建授权代码,并通过以下方式返回给 Google: 使用授权代码将用户的浏览器重定向回 Google 附件。
Google 会将授权代码发送到您的令牌交换端点, 验证代码的真实性并返回访问令牌和 刷新令牌。访问令牌是一个短期有效的令牌 作为访问 API 的凭据。刷新令牌长期有效 Google 可以存储该令牌,以便在用户首次访问该令牌时, 过期。
在用户完成账号关联流程后, 从 Google 助理发送到您的 fulfillment webhook 的请求包含 访问令牌。
处理授权请求
当您的 Action 需要通过 OAuth 2.0 授权代码执行账号关联时 流程中,Google 会通过请求将用户发送到您的授权端点 包含以下参数:
授权端点参数 | |
---|---|
client_id |
您在 Google 注册的 Google 客户端 ID。 |
redirect_uri |
此请求的响应发送到的网址。 |
state |
将一个在 重定向 URI。 |
scope |
可选:一组以空格分隔的范围字符串,用于指定 Google 请求授权的数据 |
response_type |
字符串 code 。 |
例如,如果您的授权端点可通过 https://myservice.example.com/auth
访问,
请求可能如下所示:
GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&scope=REQUESTED_SCOPES&response_type=code
为了让授权端点能够处理登录请求,请执行以下步骤:
验证
client_id
与您注册的 Google 客户端 ID 是否一致 并且redirect_uri
与 Google 提供的重定向网址相匹配 。这些检查对于防止向 意外或配置错误的客户端应用如果您支持多个 OAuth 2.0 流程,也请确认
response_type
为code
。检查用户是否已登录您的服务。如果用户没有登录, 完成服务的登录或注册流程。
生成 Google 将用于访问您的 API 的授权代码。 授权代码可以是任何字符串值,但它必须是唯一的 代表用户、令牌对应的客户端以及代码的有效期 而且不可猜测出来。您通常需要进行授权 会在大约 10 分钟后过期。
确认
redirect_uri
参数指定的网址 采用以下格式: YOUR_PROJECT_ID 是项目设置页面上的 ID Actions 控制台界面。https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
将用户的浏览器重定向到
redirect_uri
参数。添加您在 以及您在重定向时返回未经修改的原始状态值 方法是附加code
和state
参数。下面是一个示例 结果网址:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID?code=AUTHORIZATION_CODE&state=STATE_STRING
处理令牌交换请求
您的服务的令牌交换端点负责处理两种令牌 广告交易平台:
- 交换访问令牌和刷新令牌的授权代码
- 用刷新令牌换取访问令牌
令牌交换请求包含以下参数:
令牌交换端点参数 | |
---|---|
client_id |
用于将请求来源标识为 Google 的字符串。此字符串必须 在您的系统中注册为 Google 的唯一标识符。 |
client_secret |
您在 Google 中为您的服务注册的密钥字符串。 |
grant_type |
所交换的令牌的类型。两者之一
authorization_code 或 refresh_token 。 |
code |
当 grant_type=authorization_code 时,代码 Google
从您的登录端点或令牌交换端点接收验证码。 |
redirect_uri |
如果值为 grant_type=authorization_code ,则此参数为
初始授权请求中使用的网址。 |
refresh_token |
如果值为 grant_type=refresh_token ,则刷新令牌 Google
从令牌交换端点接收的令牌 |
交换访问令牌和刷新令牌的授权代码
用户登录且您的授权端点返回短期授权后 代码,Google 就会向您的令牌交换端点发送请求, 访问令牌和刷新令牌的授权码。
对于这些请求,grant_type
的值为 authorization_code
,值
code
是您先前向 Google 授予的授权代码的值。
以下是使用授权代码交换
访问令牌和刷新令牌:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=REDIRECT_URI
要将授权代码交换为访问令牌和刷新令牌,您的
令牌交换端点响应执行以下步骤的 POST
请求:
- 验证
client_id
是否将请求来源标识为已获授权的来源。 并且client_secret
与预期值匹配。 - 请验证以下内容:
<ph type="x-smartling-placeholder">
- </ph>
- 授权代码有效且未过期,且客户端 请求中指定的 ID 与 授权代码。
redirect_uri
参数指定的网址完全相同 初始授权请求中使用的值。
- 如果您无法验证上述所有条件,则返回 HTTP
正文为
{"error": "invalid_grant"}
的 400 Bad Request 错误。 - 否则,使用授权代码中的用户 ID 生成刷新 令牌和访问令牌。这些标记可以是任何字符串值,但它们必须 唯一代表令牌的用户和客户端,不得 更容易被猜到。对于访问令牌,请记录令牌的到期时间 (通常在您发放令牌一小时后)。刷新令牌不会过期。
- 在 HTTPS 响应的正文中返回以下 JSON 对象:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Google 会存储用户的访问令牌和刷新令牌,并记录 访问令牌的过期日期。访问令牌过期后,Google 会使用刷新 令牌,从令牌交换端点获取新的访问令牌。
用刷新令牌换取访问令牌
访问令牌过期后,Google 会向您的令牌交换端点发送请求 将刷新令牌交换为新的访问令牌。
对于这些请求,grant_type
的值为 refresh_token
,值
refresh_token
是您之前授予 Google 的刷新令牌的值。
以下是用刷新令牌交换
访问令牌:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
如需将刷新令牌交换为访问令牌,令牌交换端点
对执行以下步骤的 POST
请求做出响应:
- 验证
client_id
是否将请求来源标识为 并且client_secret
与预期 值。 - 请确认刷新令牌有效,以及在 请求与刷新令牌所关联的客户端 ID 相匹配。
- 如果您无法验证上述所有条件,则返回 HTTP
正文为
{"error": "invalid_grant"}
的 400 Bad Request 错误。 - 否则,请使用刷新令牌中的用户 ID 来生成访问权限 令牌。这些标记可以是任何字符串值,但它们必须唯一地表示 令牌对应的用户和客户端,并且不得被猜到。 对于访问令牌,请记录令牌的到期时间 (通常在您发放令牌一小时后)。
- 在 HTTPS 的正文中返回以下 JSON 对象
回答:
{ "token_type": "不记名", "access_token": "ACCESS_TOKEN", “expires_in”:SECONDS_TO_EXPIRATION }
Thiết kế giao diện người dùng bằng giọng nói cho quy trình xác thực
Kiểm tra xem người dùng đã được xác minh hay chưa và bắt đầu quy trình liên kết tài khoản
- Mở dự án Actions Builder trong Bảng điều khiển Actions.
- Tạo một cảnh mới để bắt đầu liên kết tài khoản trong Thao tác của bạn:
- Nhấp vào Cảnh.
- Nhấp vào biểu tượng thêm (+) để thêm một cảnh mới.
- Trong cảnh mới tạo, hãy nhấp vào biểu tượng thêm add cho Điều kiện.
- Thêm một điều kiện để kiểm tra xem người dùng liên kết với cuộc trò chuyện có phải là người dùng đã xác minh hay không. Nếu quy trình kiểm tra không thành công, Hành động của bạn sẽ không thể thực hiện quy trình liên kết tài khoản trong cuộc trò chuyện và phải quay lại cung cấp quyền truy cập vào chức năng không yêu cầu liên kết tài khoản.
- Trong trường
Enter new expression
trong mục Điều kiện, hãy nhập logic sau:user.verificationStatus != "VERIFIED"
- Trong phần Chuyển cảnh, hãy chọn một cảnh không yêu cầu liên kết tài khoản hoặc một cảnh là điểm truy cập vào chức năng chỉ dành cho khách.
- Trong trường
- Nhấp vào biểu tượng thêm add cho Điều kiện.
- Thêm một điều kiện để kích hoạt quy trình liên kết tài khoản nếu người dùng không có danh tính được liên kết.
- Trong trường
Enter new expression
trong mục Điều kiện, hãy nhập logic sau:user.verificationStatus == "VERIFIED"
- Trong mục Chuyển đổi, hãy chọn cảnh hệ thống Liên kết tài khoản.
- Nhấp vào Lưu.
- Trong trường
Sau khi lưu, một cảnh liên kết tài khoản mới có tên là <SceneName>_AccountLinking
sẽ được thêm vào dự án của bạn.
Tuỳ chỉnh cảnh liên kết tài khoản
- Trong mục Cảnh, hãy chọn cảnh hệ thống liên kết tài khoản.
- Nhấp vào Gửi câu lệnh rồi thêm một câu ngắn để mô tả cho người dùng lý do Hành động cần truy cập vào danh tính của họ (ví dụ: "Để lưu các lựa chọn ưu tiên của bạn").
- Nhấp vào Lưu.
- Trong mục Điều kiện, hãy nhấp vào Nếu người dùng hoàn tất việc liên kết tài khoản.
- Định cấu hình cách quy trình sẽ diễn ra nếu người dùng đồng ý liên kết tài khoản của họ. Ví dụ: gọi webhook để xử lý mọi logic nghiệp vụ tuỳ chỉnh cần thiết và chuyển về cảnh ban đầu.
- Nhấp vào Lưu.
- Trong mục Điều kiện, hãy nhấp vào Nếu người dùng huỷ hoặc đóng tính năng liên kết tài khoản.
- Định cấu hình cách quy trình sẽ diễn ra nếu người dùng không đồng ý liên kết tài khoản của họ. Ví dụ: gửi một thông báo xác nhận và chuyển hướng đến những cảnh cung cấp chức năng không yêu cầu liên kết tài khoản.
- Nhấp vào Lưu.
- Trong mục Điều kiện, hãy nhấp vào Nếu xảy ra lỗi hệ thống hoặc lỗi mạng.
- Định cấu hình cách luồng nên tiếp tục nếu không thể hoàn tất luồng liên kết tài khoản do lỗi hệ thống hoặc lỗi mạng. Ví dụ: gửi một thông báo xác nhận và chuyển hướng đến những cảnh cung cấp chức năng không yêu cầu liên kết tài khoản.
- Nhấp vào Lưu.
Xử lý yêu cầu truy cập dữ liệu
Nếu yêu cầu của Trợ lý có chứa mã truy cập, trước tiên, hãy kiểm tra để đảm bảo mã truy cập đó hợp lệ (và chưa hết hạn), sau đó truy xuất tài khoản người dùng được liên kết từ cơ sở dữ liệu của bạn.