这个问题实际上是this我的问题的一个连续问题。我试图通过使用授权代码流从Identityserver4获取access_token和id_token。
但是,如果我尝试访问“授权”端点,我得到405(方法不允许)HTTP错误。
HTTP GET请求
http://localhost:2000/connect/authorize?
client_id=client
&client_secret=secret
&grant_type=authorization_code
&username=admin
&password=admin
&response_type=id_token+token
&scope=openid+profile+offline_access
客户端:
new Client
{
ClientId = "client",
ClientSecrets = { new Secret("secret".Sha256())},
AllowedGrantTypes = new List<string> { "authorization_code" },
AccessTokenType = AccessTokenType.Jwt,
AllowedScopes = { StandardScopes.OpenId.Name, "api1" }
}
用户:
new InMemoryUser
{
Subject = "1",
Username = "admin",
Password = "admin"
}
我的问题是,如何调用授权端点来获取access_token和id_token?我的“客户端”和“用户”配置出了什么问题?
答案 0 :(得分:1)
两个想法:
HTTP 405错误可能是由于网络浏览器same origin policy造成的。您的客户端看起来像机密客户端而不是基于浏览器的客户端,这意味着相同的源策略不适用,除非您错误地通过Web浏览器发出该请求。
当您使用不允许的HTTP谓词时,也会发生HTTP 405错误。例如,如果您在网址仅允许POST
时使用GET
。 100%确定您提出GET
请求。
答案 1 :(得分:1)
你有几个问题。你正在混合多个流程。
1)如果您想从授权端点(而不是令牌端点)返回id_token
,则需要使用混合流...而不是授权代码流。见here。因此,您需要相应地更改响应类型。如果您的客户端是SPA,您可以使用隐式流并从Authorize端点获取id_token
和access_token
- 但不是授权代码流。
2)client_secret
不是Authorize端点的参数。 grant_type
也不是。http://localhost:2000/connect/authorize?
client_id=client
&redirect_uri=<add redirect uri>
&response_type=code+id_token+token
&scope=openid+profile+api1
&state=...
。有关有效参数,请参阅here。
3)在任何情况下,您都不会向Authorize端点发送用户名和密码。如果您正在使用资源所有者流,则将它们发送到令牌端点 - 但从不授权。请参阅上面的链接以及有效参数的说明。
因此,您可以切换到混合流并将代码更改为:
id_token
此来电的回复包括access_token
和new Client
{
ClientId = "client",
ClientName = "Your Client",
AllowedGrantTypes = GrantTypes.Hybrid,
ClientSecrets =
{
new Secret("secret".Sha256())
},
RedirectUris = { "<add redirect uri>" },
PostLogoutRedirectUris = { "<add post logout redirect uri>" },
AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
"api1"
}
};
。
ref.child("colors").child("someSpecificColor").observeSingleEvent(of: .value, with: { (snapshot) in
// Get color values
let value = snapshot.value as? NSDictionary
let name = value?["name"] as? String ?? ""
let code = value?["code"] as? String ?? ""
let shade = value?["shade"] as? String ?? ""
// ...
}) { (error) in
print(error.localizedDescription)
}