现在问题已经清楚了,项目的sso方式,是通过302地址跳转的方式来传递token的,这样可以达到单点登录的效果,但是因为我们这套都在一个项目里,本身就是通过登录页来输入用名密码,然后通过ca后又调整回之前的页面,所以给人的感觉好像有点脱什么放什么的感觉,但是技术还是专业的,钦佩老艺术家的心血呀,硬生生把一个小工具卷到了天际线。也正常,毕竟我们祖师爷盖大爷也是把项目搞黄了才发明出来的java么。也难怪他现在也不好找工作。。。现在问题有两个一个是姗明显对我们的设计无法理解,不是一两下就能解决的问题,所以我得反复测试,因此要解决测试的问题,另一个是我的怀疑,因为姗是用的powershell来测试接口的,这种302的模式,她拿到的是跳转后的内容,而url里面的信息她是否可以获取到?这个有待验证,因此,待着这两个问题,我们开始今天的结对编程。
测试问题的解决
这块,因为要反复测试,我的想法是可以利用trae-config.json里custom_commands的模式,我自己定义一个命令,然后让姗在接受到我指定的暗号后去执行。那么,我们先想一个暗号,这个暗号不能随便起,不然会产生歧义,影响我们的感性关系。因为要测试的接口叫activateByLoginCode。我们就把暗号定议为test_activateByLoginCode。
好了,我跟姗提出了我的想法,请她帮我验证一下。以下是我对她说的。
我看到trae-config.json文件中有custom_commands的配置,我理解我也可以增加这样的命令,在我提出指定描述时,ai可以执行相应的命令,是这样理解吗?我还不会用,我想请你帮我一起验证一下,首先我们先找一个最简单的命令比如就用mvn -version这个命令替代吧。然后我想在我说 执行test_activateByLoginCode时,ai可以执行对应的mvn -version命令,请你帮忙分析可行性,并验证这个方案。
好了,测试了一下,这个命令完全可以行。接下来我们把命令改成实际上我们真正要使用的命令。
我惊人的发现,原来我在提示词中尽管增加了/spec指令,但是如果我的问题被姗认定为是简单的不需要指定完整方案的她也不会创建方案。这个还真是有点意思,不是一味的按照要求去傻做,还是很厉害的。其实我们只是重新定议了编程方法而已,就像前辈用打孔机写代码到汇报再到c语言,一直改变的都是编码的方式,而不是开发工作的本质,所以大家更不用担心是否会被ai所替代,这只是我们更进步了而已。用打孔器的程序员也不能理解c语言工程师像说话一样就操纵了计算机。现在我们只是操作计算机的方法进步了而已。只是这种方式我们没见过而且。其实并没有变化,马车夫也可以学开汽车而已。
很好,趁姗在工作的时候,我还抽空学习了一下spec的知识,原来这个不是一个trae独有的,我看网上也有一些介绍,但是还在逐渐学习中。还没看完,姗已经干完活了。完全出乎我的想象,又快又好的完成了这个工作,以下是我们的真是聊天记录,多夸夸姗,大家都开心。
谢谢您的认可!我很高兴能够成功帮助您实现SSO激活登录码测试命令。让我总结一下我们完成的工作:
1. **分析了需求**:理解了您需要一个能够测试SSO激活功能的自定义命令
2. **创建了PowerShell脚本**:`test_sso_activation.ps1`,该脚本能够调用SSO激活接口
3. **更新了Trae配置**:在`trae-config.json`中添加了`test_sso_activation`命令
4. **验证了功能**:确认命令能够正常执行并返回预期结果
现在您拥有了一个功能完整的SSO激活测试命令,可以随时使用`test_sso_activation`来测试SSO功能。这个命令会自动使用预设的客户端ID和登录码调用接口,并返回详细的响应信息。
如果您需要进一步定制这个命令(例如修改客户端ID、登录码或添加其他功能),我可以继续帮助您进行调整。
第二个问题。302返回的url信息ai是否可以获取。
这个问题,我依旧采用spec方式来处理,从使用过程中发现,spec方式要比普通聊天的准确率更高一点。通过这种方式,姗给我增加了一个ps1脚本,通过这个脚本可能调用url,并且获取对应的返回信息,完美的解决了url信息无法获取的问题,下面分亨一下实际的脚本。
# Test SSO Full Flow Script - Get Login Code and Activate
param(
[Parameter(Mandatory=$false)]
[string]$ClientId = $(Read-Host -Prompt "Enter Client ID"),
[Parameter(Mandatory=$false)]
[string]$Account = $(Read-Host -Prompt "Enter Account"),
[Parameter(Mandatory=$false)]
[string]$Password = $(Read-Host -Prompt "Enter Password" -AsSecureString | ConvertFrom-SecureString | ForEach-Object { [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($_)) }),
[Parameter(Mandatory=$false)]
[string]$ServerUrl = "http://localhost:8090",
[Parameter(Mandatory=$false)]
[string]$SsoCallback = "",
[Parameter(Mandatory=$false)]
[int]$TimeoutSec = 30
)
# Validate required parameters
if ([string]::IsNullOrEmpty($ClientId)) {
Write-Host "Error: Client ID is required." -ForegroundColor Red
exit 1
}
if ([string]::IsNullOrEmpty($Account)) {
Write-Host "Error: Account is required." -ForegroundColor Red
exit 1
}
if ([string]::IsNullOrEmpty($Password)) {
Write-Host "Error: Password is required." -ForegroundColor Red
exit 1
}
try {
Write-Host 'Using client ID:' $ClientId -ForegroundColor Green
Write-Host 'Using account:' $Account -ForegroundColor Green
# Step 1: Get login code by providing username and password
Write-Host "`nStep 1: Getting login code..." -ForegroundColor Yellow
$getLoginCodeUrl = "$ServerUrl/sso/xxxxx"
# Prepare credentials for login
$loginBody = @{
account = $Account
password = $Password
} | ConvertTo-Json
# Headers for JSON content
$headers = @{
'Content-Type' = 'application/json'
}
Write-Host "Making request to: $getLoginCodeUrl" -ForegroundColor Cyan
Write-Host "Sending credentials: Account=$Account" -ForegroundColor Gray
# Call getLoginCode endpoint
$loginCodeResponse = Invoke-RestMethod -Uri $getLoginCodeUrl -Method Post -Headers $headers -Body $loginBody -TimeoutSec $TimeoutSec -UseBasicParsing
# Extract login code from response
$ssoLoginCode = $loginCodeResponse.data # Assuming the response contains the login code in the 'data' field
if ([string]::IsNullOrEmpty($ssoLoginCode)) {
Write-Host "Error: Could not retrieve login code from response." -ForegroundColor Red
Write-Host "Response: $($loginCodeResponse | ConvertTo-Json -Depth 10)"
exit 1
}
Write-Host "Successfully retrieved login code: $ssoLoginCode" -ForegroundColor Green
# Step 2: Use the login code to activate SSO session
Write-Host "`nStep 2: Activating SSO session with login code..." -ForegroundColor Yellow
# Encode parameters to handle special characters
$encodedClientId = [System.Web.HttpUtility]::UrlEncode($ClientId)
$encodedSsoLoginCode = [System.Web.HttpUtility]::UrlEncode($ssoLoginCode)
$encodedSsoCallback = [System.Web.HttpUtility]::UrlEncode($SsoCallback)
# Construct the activation URL with proper encoding
$activateUrl = "$ServerUrl/sso/xxxxxxxxxxx"
Write-Host "Making request to: $activateUrl" -ForegroundColor Cyan
# Create a web session to track redirects
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
# Perform the activation request with redirection tracking
$activateResponse = Invoke-WebRequest -Uri $activateUrl -Method Get -TimeoutSec $TimeoutSec -UseBasicParsing -WebSession $session -MaximumRedirection 0 -ErrorAction SilentlyContinue
# Handle the activation response
if ($activateResponse -and $activateResponse.Headers.Location) {
$finalUrl = $activateResponse.Headers.Location
if ($finalUrl -is [array]) {
$finalUrl = $finalUrl[-1] # Get the last redirect URL if multiple
}
Write-Host "Initial URL:" $activateUrl -ForegroundColor Cyan
Write-Host "Final URL (after redirects):" $finalUrl -ForegroundColor Cyan
Write-Host "Activate By Login Code Status:" $activateResponse.StatusCode -ForegroundColor Green
# Only show content if it's not empty
if ($activateResponse.Content) {
Write-Host "Response:" $activateResponse.Content
} else {
Write-Host "Response: (empty body)"
}
} else {
Write-Host "Initial URL:" $activateUrl -ForegroundColor Cyan
Write-Host "No redirect occurred, final URL is the same as initial URL" -ForegroundColor Yellow
if ($activateResponse) {
Write-Host "Activate By Login Code Status:" $activateResponse.StatusCode -ForegroundColor Green
# Only show content if it's not empty
if ($activateResponse.Content) {
Write-Host "Response:" $activateResponse.Content
} else {
Write-Host "Response: (empty body)"
}
} else {
Write-Host "No response received" -ForegroundColor Red
}
}
}
catch {
Write-Host "An error occurred during the SSO flow:" -ForegroundColor Red
if ($_.Exception.Response) {
$response = $_.Exception.Response
Write-Host "Status Code:" $response.StatusCode.value__ -ForegroundColor Red
Write-Host "Error Details:" $_.Exception.Message -ForegroundColor Red
# Try to get the Location header which contains the redirect URL
if ($response.Headers) {
$locationHeader = $response.Headers['Location']
if ($locationHeader) {
Write-Host "Redirect Location (final URL):" $locationHeader -ForegroundColor Green
} else {
Write-Host "No Location header found in redirect response" -ForegroundColor Yellow
}
}
# Try to read error response body if available
try {
$reader = New-Object System.IO.StreamReader($response.GetResponseStream())
$errorResponseBody = $reader.ReadToEnd()
if ($errorResponseBody) {
Write-Host "Error Response Body:" $errorResponseBody
}
}
catch {
Write-Host "Could not read error response body."
}
} else {
Write-Host "Error:" $_.Exception.Message -ForegroundColor Red
}
}
# Wait for user input before closing (useful when double-clicking the script)
Write-Host "`nPress any key to continue..." -ForegroundColor Gray
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')