V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kmvan
V2EX  ›  程序员

关于渣浪oauth授权跳转的疑问。

  •  
  •   kmvan · 2013-12-28 22:51:12 +08:00 · 3793 次点击
    这是一个创建于 3771 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我有一个网页应用,用户能在自己的网站(站A),通过自己的渣浪微博帐号授权我的网页应用,然后在网站上写文章能发布微博。
    但我有以下疑问:

    1.网页应用的回调(callback)地址,写的是我服务器(站B)的地址,那用户授权后,怎么返回到站A的页面呢?

    可能我的思路有点乱,我描述一下操作过程:
    用户在站A想要发微博 =》 点击授权链接 =》 弹窗一个授权协议(主机为weibo.com的)=》 点击确认授权 =》 跳转到我的服务器站B =》 ????(然后怎么搞)
    跳转到站B后,我站B如何返回到站A呢?
    16 条回复    1970-01-01 08:00:00 +08:00
    txlty
        1
    txlty  
       2013-12-28 23:17:04 +08:00   ❤️ 1
    oauth2.0很简单了。
    请求平台authorize url,带上appid/appkey,callback url,回调地址。用户点击授权之后,跳转到回调地址(此处可加state验证防CSRF攻击)。给你返回的参数里有个code
    用上面取得的code,请求平台的token url,获得access_token。
    以后就用这个access_token,调用平台的api。
    txlty
        2
    txlty  
       2013-12-28 23:27:08 +08:00   ❤️ 1
    又看了一边楼主问题。真心没看懂。
    你是康盛漫游app开发者?
    kmvan
        3
    kmvan  
    OP
       2013-12-28 23:36:10 +08:00
    @txlty 感谢回复。but我还是有点混乱>_+
    问题在这里,用户的站A,他只有akey、skey 和 callback url,用sdk算出授权页面地址后,点击授权,然后跳转是跳转到我服务器的页面啊,那站A怎么可以获取到跳转后的信息呢?
    kmvan
        4
    kmvan  
    OP
       2013-12-28 23:54:17 +08:00
    @txlty 哪里不懂?我可以说到懂为止....
    gracece
        5
    gracece  
       2013-12-28 23:57:32 +08:00   ❤️ 1
    @kmvan 为什么要用B去处理微博授权呢?
    kmvan
        6
    kmvan  
    OP
       2013-12-29 00:01:55 +08:00
    @gracece 因为回调页面的地址是B地址。而且用户的站点不是固定的啊。
    gracece
        7
    gracece  
       2013-12-29 00:06:47 +08:00   ❤️ 1
    @kmvan 好像有点明白你的意思了,类似于wordpress上能装多说,然后授权多说,在wordpress上发表文章时能选择同步到微博。
    kmvan
        8
    kmvan  
    OP
       2013-12-29 00:08:52 +08:00
    @gracece 嗯,可以这样理解。但我的平台不是wp而已。
    master
        9
    master  
       2013-12-29 00:22:21 +08:00   ❤️ 1
    这个你需要多和A站约定一个协议。
    当然做法很多,下面给出一种参考就是:

    不是通过A战直接点到你的授权连接,而是A站给出一个连到B站的连接由B站的连接去调用授权页面(这样B站可以用事先约定好的方式知道是谁要通过自己来授权,然后当B站完成授权之后,再通过和A站约定好的方式告诉A站来完成最后的授权过程。
    kmvan
        10
    kmvan  
    OP
       2013-12-29 00:37:47 +08:00
    @master 这样一说,我好像有点思路了。谢谢回复。明天我试试,#Q
    txlty
        11
    txlty  
       2013-12-29 02:22:34 +08:00   ❤️ 1
    这就分两种情况了。你在A站有下发服务端代码给他们执行的权限?还是只有执行JS的权限?

    两种情况,你都需要用户(A站)在页面里载入一个你网站(B站)域下的JS文件。
    用户完成授权,返回到B站是在窗口里。可以执行关闭窗口操作。
    父页面还是A站,在窗口关闭时,通过JS请求B站数据,以确认是否登录成功。

    如果有服务端代码权限,那么:
    授权成功后,将获得的access_token写入A站域下的cookie。cookie过期时间等于access_token过期时间。然后A站就可以用这个access_token调用API发微博了。(tx微博不行,因为tx调用API还需要appid)

    如果像社会化评论框那样,只有JS执行权限。那么:
    授权成功后,将以后需要的cookie写入B站域下。
    发微博时,在A站通过JS向B站发出请求。所有与平台的交互,都由B站完成。A站通过JS与B站通信。
    也就是说,A站本身与平台无关。
    B站用正常oauth2.0调用微博平台API,登录、发微博,同时作为一个平台,接收A站请求。

    跨域问题,通过动态载入JS的方式解决。
    dagger
        12
    dagger  
       2013-12-29 10:16:29 +08:00   ❤️ 1
    如果只是要完成跳转,不考虑其它授权和安全的问题,为什么不直接把A站的url作为参数塞到在oauth请求里,这样的话callback回B站的时候B站只要提取这个参数然后跳转回A站不就可以了吗
    rekey
        13
    rekey  
       2013-12-29 22:30:57 +08:00   ❤️ 1
    B站搞完了以后通知A站来取...
    kmvan
        14
    kmvan  
    OP
       2013-12-30 11:35:28 +08:00
    感谢楼上各路大侠回复。我参考了大家的意见,授权终于能成功work起来了。
    原来有一个“安全域名”设置,在那个域名下的任何二级域名和页面都能成为授权路径,这样的话,就能通过uri参数作为回调,虽然看起来不是很安全。
    谢谢大家解答~
    julyclyde
        15
    julyclyde  
       2013-12-30 23:47:38 +08:00   ❤️ 1
    总的来说这个设计有问题
    你其实做的是嵌入别人网站的widget吧?
    kmvan
        16
    kmvan  
    OP
       2014-01-02 15:18:56 +08:00
    @julyclyde 对,现在已经应用已经通过审核了。应用地址是 http://inn-studio.com/sinapicv2 屌图床
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5387 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 08:43 · PVG 16:43 · LAX 01:43 · JFK 04:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.