我正在使用Oauth隐式授权流程来登录应用程序。当用户访问未经过身份验证的站点时,会将其发送到具有以下结构的URL:
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如何解释与我现有的代码不兼容的网址或完全不同的东西?
非常感谢。
答案 0 :(得分:0)
事实证明:accessToken
是一只红鲱鱼。
删除redirecturl
导致Chrome中出现相同行为的原因是因为它意味着该网址与浏览器中的网址不匹配,因此代码未执行。但是,在Safari中,代码未执行,原因是URL中的不同不匹配,与redirecturl
设置的内容有关。
最初我将baseurl + '/test'
设置为baseurl + 'test/#token_type'
。这导致从服务器踢回的网址为/
。
导航到此网址时,Chrome会自动添加baseurl + 'test/#/token_type'
,将网址更改为$urlRouterProvider.when()
,我的/
功能可以匹配。
Safari未添加$urlRouterProvider.when()
,因此redirecturl
从未找到匹配且代码未执行。
我能够通过将我的初始baseurl + '/test/'
设置为baseurl + '/test'
而非DataFrame
来解决此问题