From 315d9e5b789d8e2389bedff9796218a61ecdb8b3 Mon Sep 17 00:00:00 2001 From: "shengzhaoli.shengz" Date: Wed, 18 Oct 2023 11:29:27 +0800 Subject: [PATCH] test flow device_code --- .../OAuth2DeviceVerificationController.java | 33 +++++++++++ .../templates/clientdetails/test_client.html | 59 +++++++++++++++++-- 2 files changed, 86 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/monkeyk/sos/web/controller/OAuth2DeviceVerificationController.java diff --git a/src/main/java/com/monkeyk/sos/web/controller/OAuth2DeviceVerificationController.java b/src/main/java/com/monkeyk/sos/web/controller/OAuth2DeviceVerificationController.java new file mode 100644 index 0000000..911b5c2 --- /dev/null +++ b/src/main/java/com/monkeyk/sos/web/controller/OAuth2DeviceVerificationController.java @@ -0,0 +1,33 @@ +package com.monkeyk.sos.web.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +import static com.monkeyk.sos.domain.shared.SOSConstants.DEVICE_VERIFICATION_ENDPOINT_URI; + + +/** + * 2023/10/17 18:49 + *

+ * Device code flow use + * + * @author Shengzhao Li + * @see org.springframework.security.oauth2.server.authorization.web.OAuth2DeviceVerificationEndpointFilter + * @since 3.0.0 + */ +@Controller +public class OAuth2DeviceVerificationController { + + + /** + * Device verification page + * + * @return view + */ + @GetMapping(DEVICE_VERIFICATION_ENDPOINT_URI) + public String deviceVerification() { + return "device_verification"; + } + + +} diff --git a/src/main/resources/templates/clientdetails/test_client.html b/src/main/resources/templates/clientdetails/test_client.html index 5501bed..c72a30e 100644 --- a/src/main/resources/templates/clientdetails/test_client.html +++ b/src/main/resources/templates/clientdetails/test_client.html @@ -23,7 +23,7 @@

-
+
请先输入client_secret:
@@ -106,7 +106,7 @@ required="required"/>
code_challenge: (后台代码生成,不可修改) + readonly="readonly"/> (后台代码生成,不可修改)
@@ -130,7 +130,8 @@ required="required" size="70"/>
code_verifier: (后台代码生成,不可修改) + readonly="readonly" size="70"/> (后台代码生成,不可修改) @@ -161,7 +162,7 @@ - + @@ -177,7 +178,51 @@
Test [device_code] OAuth2.1新增
- ...... +
    +
  1. +

    设备上请求 /oauth2/device_authorization获取 user_code, + device_code,verification_uri

    + + + + + + POST +
  2. +

    一般此步骤是在设备上通过代码来完成, 此处只作演示流程

    + +
  3. +

    在设备上展示user_code或显示一个二维码(内容为verification_uri_complete URL)

    +

    用已经登录成功的浏览器(或另一个已经认证的设备)访问verification_uri_complete URL(可通过扫码等方式获取内容)

    +

    + 此处方便演示, 请点击/oauth2/device_verification并输入上一步获取到的user_code + (若未认证将跳转到登录) +

    +

    提示:此步骤必须在有效时间内完成, user_code的有效时长在上一步中返回的数据expires_in来决定(单位:秒, 默认5分钟)

    +
  4. +
  5. +

    + 在第2步进行的同时, 设备上后台将定时(如每隔5秒)向spring-oauth-server发起获取token的请求/oauth2/token + (需要使用第1步中获取到 device_code 的值), + 直到获取成功(即第2步操作完成授权设备登录)或超时(即设备轮询请求等待的时长超出第1步返回的时间expires_in) +

    + device_code: +
    + + + + + + POST +
    +

    提示:在第2步进行过程中调用第3步获取token API时会响应等待授权的结果(Http状态码 400, error='authorization_pending')

    +
  6. +
+
@@ -224,7 +269,8 @@ /oauth2/token?client_id={{clientId}}&client_secret={{clientSecret}}&grant_type=refresh_token&refresh_token={{refreshToken}} POST | - 复用refresh_token: + 复用refresh_token:
@@ -239,6 +285,7 @@ var TestClientCtrl = ["$scope", function ($scope) { $scope.clientId = [[${clientDetailsDto.clientId}]]; $scope.clientSecret = ""; + $scope.deviceCode = ""; $scope.scope = [[${clientDetailsDto.scopesWithBlank}]]; $scope.codeChallenge = [[${codeChallenge}]];