我正在使用Oauth隐式授予流登录到应用程序。当用户访问未经身份验证的网站时,他们将被发送到具有以下结构的网址:

baseurl + '/oauth/authorize?response_type=token&client_id=xxxx&redirect_uri=' + redirecturl


baseurl是页面的位置,其中包含用于输入用户名和密码的输入。输入正确的凭据并单击该页面上的“登录”按钮后,您将被带到redirecturlredirecturl是用户首次尝试访问的应用程序本身(角度应用程序)的位置。

以下代码处理用户登录后发生的特殊情况:

$urlRouterProvider
            .when('/token_type=bearer&access_token=:accessToken', function ($location, $state, User, storageService) {
                    storageService.clearAll();
                    User.authenticate($location.path().substr(1));
                    $state.go('marketplace.applications');
                }
        );


使用Chrome时,一切正常。当我使用Safari时,上面的代码永远不会执行。

注意传递给:accessToken的字符串中包含的$urlRouterProvider.when()

我做了一些调查,发现如果删除传递给:accessToken的字符串的$urlRouterProvider.when()部分,则可以在Chrome中重现相同的行为。这使我相信Safari不知道如何解释:accessToken变量。关于Safari如何解释与我现有的代码不兼容的url,是否还有其他一些事情?

非常感谢。

最佳答案

事实证明:accessToken是一个红色鲱鱼。

删除:accessToken会在Chrome中导致相同行为的原因是,这意味着url与浏览器中的URL不匹配,因此代码未执行。但是,在Safari中,由于url中存在其他不匹配而导致代码无法执行,这与redirecturl设置有关。

最初,我将redirecturl设置为baseurl + '/test'。这导致从服务器踢回的URL为baseurl + 'test/#token_type'

导航到该URL时,Chrome浏览器会自动添加一个/,将该URL更改为baseurl + 'test/#/token_type',我的$urlRouterProvider.when()函数可以匹配该URL。

Safari没有添加/,因此$urlRouterProvider.when()从未找到匹配项,并且代码未执行。

我可以通过将初始redirecturl设置为baseurl + '/test/'而不是baseurl + '/test'来解决此问题

关于javascript - Safari无法解释url变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37013071/

10-14 20:37