在Salesforce OAuth流中使用immediate = true

时间:2016-08-11 20:13:51

标签: oauth oauth-2.0 salesforce authorization

之前在他们认为偏离主题的Salesforce StackExchange中问了这个问题,所以在这里询问我是否能得到答案。

背景

我正在尝试使用immediate参数来检查Salesforce用户在通过OAuth 2.0 Web Server Authentication Flow中记录的Web服务器OAuth流时是否已经批准访问权限。我的理由是,我不希望出现登录或同意提示,因此如果他们尚未批准,我可以拒绝访问。

点击回调页面后,即使用户之前已经批准了该应用程序并且已登录,我仍然会收到参数error=immediate_unsuccessful

我试图通过自定义的Google OAuth 2 Playground检查这一点,并在authorize端点的末尾设置immediate = true或immediate = false。在= false时,会显示同意提示,然后您可以授予访问权限。 On = true,返回与先前列出的相同的错误。

已设置的已连接应用程序具有api和refresh_token作为可用范围,用户可以自行授权并且没有设置ip限制。然后,此应用程序中的客户端ID和密码将传递到OAuth 2 Playground。

下面是一个简短的示例,说明我的正确应用程序如何使用Java和Google OAuth客户端库重定向到auth url。我们最初在没有立即声明的情况下授权客户端,然后稍后使用immediate = true调用相同的代码(如示例所示)

AuthorizationCodeFlow authorizationCodeFlow = new AuthorizationCodeFlow.Builder(BearerToken.authorizationHeaderAccessMethod(), 
            httpTransport, 
            GsonFactory.getDefaultInstance(), 
            new GenericUrl("https://login.salesforce.com/services/oauth2/token"),
            new ClientParametersAuthentication(CLIENT_ID, CLIENT_SECRET), 
            CLIENT_ID,
            "https://login.salesforce.com/services/oauth2/authorize")
            .setCredentialDataStore(StoredCredential.getDefaultDataStore(MemoryDataStoreFactory.getDefaultInstance()))
            .build();

    AuthorizationCodeRequestUrl authUrl = authorizationCodeFlow.newAuthorizationUrl()
        .setRedirectUri("https://72hrn138.ngrok.io/oauth/callback")
        .setScopes(ImmutableSet.<String> of("api", "refresh_token"))
        .set("prompt", "consent")
        .set("immediate", "true");

    response.redirect(authUrl);

问题(S)

  • 我是否有任何可能在Salesforce中遗漏的设置可以缓解错误?
  • OAuth 2规范中是否还有其他选项必须设置为立即选项?
  • 立即设置是否有效?

1 个答案:

答案 0 :(得分:1)

我最终设法解决了这个问题。要允许immediate=true选项起作用,必须从请求中删除范围。在提供的示例中,您将authUrl修改为以下内容:

AuthorizationCodeRequestUrl authUrl = authorizationCodeFlow.newAuthorizationUrl()
    .setRedirectUri("https://72hrn138.ngrok.io/oauth/callback")
    .set("prompt", "consent")
    .set("immediate", "true");

我认为理论是定义范围意味着您要求使用这些范围的权限,因此需要批准这些权限。这与立即选项冲突,该选项指出用户必须已登录并且客户端ID已被批准才能成功。