QQ是在你发出第一次请求的时候自己设置的回调页,不是在管理页面写死的吧。
说实话大概看了一下没懂你的需求。
在新浪微博授权登录的时候,你需要自己设定在某个时刻回调页面A,某个时刻回调页面B?这个需求的出发点是什么?
QQ登录时在请求时,自己设置回调页的。新浪微博登录是要在 开发者管理中心设定好授权页面,授权成功后,返回改页面的。 我现在是设置的是 登录时进行授权,然后经过我自己的业务逻辑处理后,后跳转进入网站。
网站内部有 解除绑定和 绑定操作,我想在处理绑定新浪微博这个业务时,回调到另外一个页面B(这个时候已经登录,原有回调页面没啥用了),我想知道怎么在授权成功后跳转到B. 新浪微博只能设置一个回调地址,而且程序内好像不能修改,不能添加参数。 QQ的话是可以自己修改的。。
@ToBeStrong: 我觉得你还是参考一些各大网站的授权流程。因为我不理解“我想在处理绑定新浪微博这个业务时,回调到另外一个页面B”的意义,和“这个时候已经登录,原有回调页面没啥用了”所指为何。、
从头说下我原来做的情况,看看你能参考以下不。
我们做了N个网站的OAuth登录,回调页面都是一个。具体根据这个URL中的一个参数TargetName区分,新浪的回调URL就设置为“回调地址?TargetName=TSina”,其他的依次类推。
1.如果想针对新浪微博的授权做什么特殊操作,可以根据这个参数区分
2.用户在登录时候是区分两种状态的,一是已经登录,二是没有登录。
2.1已经登录(在本网站登录)的,如果没有绑定第三方帐号,在数据库插入一条关联的数据。如果已经绑定了第三方帐号(数据库里面有这条数据,那么update记录的accesstoken和过期时间)
之后跳转到预定的页面(已经是网站的正常内容界面了)
2.2没有绑定的显示一个中转页,提示他是新注册账户绑定还是登录原有账户绑定,根据选择先进行原有网站的注册/登录操作,然后参考2.1中的步骤。
@空葫芦: 嗯,非常感谢,我是才弄这个,所以比较困惑。现在我有两个问题请教一下哈:
1. 回调页是不是只能在 管理中心那里设置一个,请求时的回调地址必须与设置的回调页地址一样?
2. 可不可以在请求时参加自定义参数。
3. 回调页不是在授权成功后返回的页面吗?如果有多个页面都需要去请求改授权,都跳转到该页面么?
这是我比较困惑的地方。 您刚不理解我的那两句话,我再解释下,语言表达能力不好,见谅啦。
就是首先在登录界面,点击微博登录并授权后,在回调页A内处理 是否有关联账户、进行关联或直接登录进入网站。 在网站内部,用户可以解绑,解绑后可以点击绑定,此时还选择绑定哪个账号,会进行授权验证,然后又要跳转到回调页面啦,(原有回调页是进行账户注册并关联的那个页面),就是在这个地方,我想让跳转到 另外一个页面B,原有回调页是登录的时候跟账户绑定的页面。我现在想让跳转到B,直接用登录账号跟授权的微博账号进行绑定,不知道我说清楚了没有。。非常感谢您的耐心解答。
@ToBeStrong:
1.我记得新浪微博是这样的,其他的各异。
2.可以,这个自定义参数一般是指回调URL包括了这些参数,他回调的时候会带着你的参数回来的,就像我刚才说的TargetName。
3.是的啊。
对外,回调页面就是一个,而且也不建议用多个。
具体的内部跳转的话,你可以用转发请求来做的。server.transfer,用MVC的话直接就return 目标Action。
“原有回调页是进行账户注册并关联的那个页面”,我觉得关键是这里的逻辑没有理清,你看随便找个网站看一下,如果当前未登录(在自己网站),回调过来应该是“绑定已有”和“注册绑定”共存的。
@ToBeStrong: 可能也是我表达不太准确。
怎么说呢,你应该先不要想那些“是不是登录了,没有登录是不是要注册,是不是解除绑定再次登录”了的
就区分,是否在本地网站登录就行了。
你所说的解绑后再绑定,也是“本地已登录”这种情况。
@空葫芦: 恩,太感谢啦,我看了下文档,是有state这个参数是会 回传给回调页面的。我可以根据这个参数进行跳转的。 恩,我就是参照着京东的做的,利用第三方登录时,回调页A就是处理第三方账户和网站内账户的那个页面(绑定已有和注册绑定共存),这是登录模块的。 在网站内部,我还有一个功能,就是登陆后,可以自己设置绑定的微博账号,可以直接解绑,未绑定用户也可以进行绑定,绑定时又要请求授权页面,然后跳转,这个时候跳转到 上面我提到的那个回调页(它已经不太合适了,因为用户还要输入自己的账号,才能关联。)这个时候我想要授权后就跳转到 另一个页面B,直接让用户选择当前登录用户是否和授权微博账号关联,用户可以选择是或否),就是这样一个页面。 我原本想让请求回调时直接跳转到这个页面,后来发现行不通,现在通过state这个参数就可以进行内部 重定向了。
QQ登录时,我设置的回调页是网站根目录,我可以在请求时,修改回调的的地址,只要是该根目录下的地址都没问题,相当于设置了多个回调地址吧。新浪微博的就不行。。
感谢您的经验之谈,我哪里说的不对,还望指教。
@空葫芦: 嗯,我就是在已经登录的账户,在内部操作绑定时,处理回调页面时遇到的问题,我设置的回调页是登录时进行绑定或者注册并绑定的那个页面,现在在内部操作绑定,如果跳转到原有回调页,就不太合适了,因为用户还要输入自己的账号和密码。
@ToBeStrong:
这里面弯弯绕绕是不少的,如果时间不紧张,可以考虑先实现再优化。
可以用state,也可以用别的新加参数。
state是有预定义的作用的,用来规避csrf风险,不过你用他来达成你的需求也没什么。
@空葫芦: 嗯,非常感谢,已经用state实现了我想要的结果,但是刚用自定义参数与替换state,发现不行额,回调的参数只有 code和state。
@ToBeStrong:使用多个参数时回调URL中的&参数要写成%26,或者你直接把callback这个URL给urlencode
这个是不是可以自己来判断,如果是内部登陆,就跳转B页面
回调页是在新浪开发者应用设置那里设置好的,程序内部好像控制不到,修改参数就报 misreturnurli...的错误。。