我正在尝试使用Postman (版本7.20.0-Linux5.5.8-200.fc31.x86_64/x64)来使用OAuth2.0“授权代码”流对由Google作为IdP支持的Keycloak 9.0.0服务器进行身份验证。
在试图为访问/刷新令牌交换代码时,Postman将向.../token端点发送以下信息:
grant_type: authorization_code
code: 4/xgFPM8rkZXA1pWguPMHPKg8GS3BrI7whtmSq2U2K4_4Cy62m10y2l3IQp3KuiLRyaLaZWKCUiGJGEWVJ9K4zcTc
redirect_uri: http://localhost:3002
client_id: mission-control
client_secret: 3cc09c80-••••-••••-••••-••••••••这在Keycloak中失败,并在邮递员控制台中确认了以下错误:
POST /auth/realms/test-realm/protocol/openid-connect/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
User-Agent: PostmanRuntime/7.23.0
Accept: */*
Cache-Control: no-cache
Postman-Token: f2cfc8be-a911-4bc6-b5be-dbfab46d3a56
Host: localhost:8080
Accept-Encoding: gzip, deflate, br
Content-Length: 246
Connection: keep-alive
grant_type=authorization_code&code=4%2FxgFPM8rkZXA1pWguPMHPKg8GS3BrI7whtmSq2U2K4_4Cy62m10y2l3IQp3KuiLRyaLaZWKCUiGJGEWVJ9K4zcTc&redirect_uri=http%3A%2F%2Flocalhost%3A3002&client_id=mission-control&client_secret=3cc09c80-••••-••••-••••-••••••••
HTTP/1.1 400
Connection: keep-alive
Cache-Control: no-store
Pragma: no-cache
Content-Type: application/json
Content-Length: 62
Date: Fri, 13 Mar 2020 08:36:02 GMT
{"error":"invalid_grant","error_description":"Code not valid"}Keycloak日志显示,此令牌格式错误:
keycloak_1 | 09:53:23,219 WARN [org.keycloak.protocol.oidc.utils.OAuth2CodeParser] (default task-35) Invalid format of the code
keycloak_1 | 09:53:23,219 WARN [org.keycloak.events] (default task-35) type=CODE_TO_TOKEN_ERROR, realmId=Test Realm, clientId=mission-control, userId=null, ipAddress=172.20.0.1, error=invalid_code, grant_type=authorization_code, client_auth_method=client-secret为了检查Keycloak或Postman是否有错误,在Netcat的帮助下,我在CLI上走过了相同的步骤:
在CLI上,在netcat的帮助下,我可以成功地遍历流,并看到不同的令牌格式:
启动netcat服务器以从浏览器窗口捕获回调:$ nc -lk localhost 3002
GET /?code=3b9ac786-f9d1-40f9-b884-35e17b2fa756.70a3be09-8edf-47ed-9803-d08550a07faa.8794bba2-6f2b-4512-8bd7-6d5073852d1c (以及更多)的
curl -XPOST -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=authorization_code&code=3b9ac786-f9d1-40f9-b884-35e17b2fa756.70a3be09-8edf-47ed-9803-d08550a07faa.8794bba2-6f2b-4512-8bd7-6d5073852d1c&redirect_uri=http%3A%2F%2Flocalhost%3A3002&client_id=mission-control&client_secret=3cc09c80-48bc-46fd-bc91-232e6bbb681a" http://localhost:8080/auth/realms/test-realm/protocol/openid-connect/token我不知道Postman OAuth流在哪里将“代码”从响应体中提取出来,它用于将令牌交换端点发送到令牌交换端点--令牌之间的差异很明显,当手动遍历它时(相同的客户机、相同的令牌、相同的oauth2服务器),代码就会松动:
3b9ac786-f9d1-40f9-b884-35e17b2fa756.70a3be09-8edf-47ed-9803-d08550a07faa.8794bba2-6f2b-4512-8bd7-6d5073852d1c当使用Postman时,它将此作为代码发送:
4/xgFPM8rkZXA1pWguPMHPKg8GS3BrI7whtmSq2U2K4_4Cy62m10y2l3IQp3KuiLRyaLaZWKCUiGJGEWVJ9K4zcTc我怎样才能让邮递员从网址中提取回调?code呢?
发布于 2020-03-25 15:13:23
当callback_uri和令牌OAuth服务器端点位于相同(localhost)域时,这是邮递员确认的错误。
Update:这个问题是在2020年9月发行的。
https://stackoverflow.com/questions/60668411
复制相似问题