适用于Mobile Native App和纯JS客户端的OAuth 2.0客户端身份

时间:2020-09-28 09:29:06

标签: oauth-2.0 oauth identityserver4 identityserver3

我正在重新分发OAuth文档,并了解https://auth0.com/docs/flows/authorization-code-flow-with-proof-key-for-code-exchange-pkce比“授权代码流”更好,因为它获得客户机代码并将其交换为access_token的可能性较小。

我还看到在互联网上有一些案例,当客户的机密从诸如Facebook或Twitter的大型移动应用程序中逆转时

所以对我来说,仍然不清楚如何正确实施客户端身份 例如如果我使用资源拥有者授予类型,则我的应用程序中存储了客户ID和客户机密,并且可以对其进行反向工程,并且任何人都可以构建与我的应用程序相同的

如果我使用带有验证密钥的授权代码流进行代码交换,我的应用程序中仍然没有任何秘密。因此,这意味着任何开发人员都可以构建自己的应用程序,该应用程序将成为我的应用程序的镜像。

那么,是否有麻烦为移动应用程序和纯JS(浏览器)客户端正确实现客户端身份?

更新 有2个不错的选择 1-使用重定向网址 2-设置CORS

1个咆哮者,我认为如果尝试使用后端代码模仿行为,那将无济于事。例如。我真的不需要访问该网站即可看到它会在某些时候提供标题重定向,而我只是收到消息并获得此授权码 2对于CORS来说也是一样,以防我的镜像站点从后端获取令牌,服务器将无法识别该客户端不是原始客户端,并且有权使用此客户端

1 个答案:

答案 0 :(得分:1)

那么,有没有办法为移动应用程序和纯JS(浏览器)客户端正确实现客户端身份?

spec,对于授权代码流,必须进行客户端身份验证。建议使用redirection URI解决方案,以帮助进行客户端身份验证。
以下是IDS4上用于帮助验证客户端身份的选项:

  1. 在客户端配置上使用RedirectUris指定允许的URI以返回令牌或授权码。 Ref
  2. 使用CORS。浏览器的同源策略禁止从其他来源读取资源。我们可以将客户添加到允许的跨域调用列表中。

代码示例:

new Client
{
    ClientId = "js",
    ClientName = "JavaScript Client",
    AllowedGrantTypes = GrantTypes.Code,
    RequireClientSecret = false,
    RedirectUris = { "https://localhost:5003/callback.html" },
    PostLogoutRedirectUris = { "https://localhost:5003/index.html" },
    AllowedCorsOrigins = { "https://localhost:5003" },
    AllowedScopes =
    {
        IdentityServerConstants.StandardScopes.OpenId,
        IdentityServerConstants.StandardScopes.Profile
    }
}