我在我的应用程序中被一个非常基本的要求困住了。这是我的设想。我正在构建一个自定义的电子商务门户,使用angular作为前端,rest作为后端。我有一个产品列表API,它将由我的application应用程序调用,而不需要用户的凭据,因为产品列表是一个公共页面。但是,我不希望其他人使用我的产品清单API。我知道我可以使用客户端id和客户端秘密来获得令牌,并使用Identityserver 4使我的API安全,但是,如何避免在一个角度应用程序中暴露我的客户端秘密呢?任何人都可以很容易地偷走它。是否有任何方法将授权代码流与PKCE一起用于公共的my,例如不需要用户id和密码的产品列表API?
发布于 2020-05-24 22:23:37
对我来说,回答这个问题的最好方法是回到授权码流.Authorization代码授予的定义,这是一个基于重定向的流,用于获取访问令牌和刷新令牌,客户端通过引导资源所有者启动流。
而pkce只是对授权代码流的扩展,以防止某些攻击。
那么答案是否定的,我们不能在没有用户登录的情况下使用PKCE中的授权代码流来保护公共API。还有其他一些方法来保护公共API,或者至少使其更少/更难访问。CORS是一个选项,请阅读更多的这里,因为它与这个问题的上下文无关,我不想更进一步。
对于有登录的场景,IdentityServer4支持授权代码流。以下是我们为实现这一目标所需要做的工作:
IdentityServer上添加js客户端的配置条目如下:new Client
{
ClientId = "jsclient",
ClientName = "JavaScript Client",
AllowedGrantTypes = GrantTypes.Code,
RequirePkce = true,
RequireClientSecret = false,
RedirectUris = { "http://localhost:5003/callback.html" },
PostLogoutRedirectUris = { "http://localhost:5003/index.html" },
AllowedCorsOrigins =
{
"http://localhost:5003"
},
AllowedScopes = {"openid", "profile", "offline_access", "api1", "api2" },
}var config = {
authority: "http://localhost:5000",
client_id: "js",
redirect_uri: "http://localhost:5003/callback.html",
response_type: "code",
scope:"openid profile api1",
post_logout_redirect_uri : "http://localhost:5003/index.html",
};
var mgr = new Oidc.UserManager(config);找到完整的示例代码这里。我强烈建议阅读quickstart doc以更好地理解实现细节。
发布于 2020-05-24 09:30:34
您应该通过插入广泛使用的OIDC客户端库来实现角应用程序中的授权代码流--它的UserManager类将为您完成这项工作。
有关如何使用它的示例,请参阅我的以下资源:
https://stackoverflow.com/questions/61980791
复制相似问题