我正在使用Oauth隐式授予流登录到应用程序。当用户访问未经身份验证的网站时,他们将被发送到具有以下结构的网址:
baseurl + '/oauth/authorize?response_type=token&client_id=xxxx&redirect_uri=' + redirecturl
baseurl
是页面的位置,其中包含用于输入用户名和密码的输入。输入正确的凭据并单击该页面上的“登录”按钮后,您将被带到redirecturl
。 redirecturl
是用户首次尝试访问的应用程序本身(角度应用程序)的位置。以下代码处理用户登录后发生的特殊情况:
$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/