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

如何将 OAuth 授权得到的 Authorization Code 与用户相关联

  •  
  •   Mystery0 · 2019-05-03 23:49:58 +08:00 · 3491 次点击
    这是一个创建于 2017 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人正在做使用 OneDrive 作为云端存储的应用,目前已经调试通过了 OneDrive 的授权、通过授权码调用 API 的流程,但是遇到了一个问题。

    因为应用是需要用户登录自己的 OneDrive 对应用进行授权,从而允许应用上传数据到用户的 OneDrive,所以需要存储很多的授权码到服务端,并且授权码与用户信息相关联。

    我大概描述一下我的目前实现:

    1. 用户主动触发授权的操作(单击按钮什么的),这个时候应用通过 WebView 调用我提前在服务端写好的 html 进行授权( html 仅仅是封装了一些必须填的参数 [微软需要的数据,包括后面会用到的 重定向 Url ] ),然后 html 会自动跳转微软的授权页面,授权成功之后会主动回调我配置好的 重定向 Url ,由于这个 重定向 Url 需要在 https://apps.dev.microsoft.com 进行配置,所以不能使用动态的方式(已测试过动态 Url [ url 的路径中带上自己的参数] 和带参的方式 [最后加上?uid=xxx ] ,都会在不同的地方提示 重定向 Urldev 中配置的不一样)。
    2. 如果授权成功,会回调服务端的一个接口,在这个接口中拿到 授权码 ,因为 授权码 是在之后使用的,同时不同的用户有不同的授权码,所以需要将 授权码 与用户信息关联起来。

    问题就出现在第二步的接口回调中,我暂时想不到办法将用户的信息从客户端传递到回调的接口中,也就是不能在接收到 授权码 之后判断这个授权码属于哪个用户的。

    求助万能的 V 友,有什么好的解决方法吗?

    9 条回复    2019-05-04 07:36:56 +08:00
    Mystery0
        1
    Mystery0  
    OP
       2019-05-03 23:54:03 +08:00
    补充: 微软的重定向 Url 有限制:URL 必须以 https:// 开头,不得包含查询字符串参数且长度不超过 255 个字符。

    看起来这个 Url 只能写死
    xxxy
        2
    xxxy  
       2019-05-03 23:56:24 +08:00 via Android   ❤️ 2
    还有个 state 字段的,在授权前保存到 session 中,成功后,redirect_url 原样返回 state 字段,这样就可以辨别了
    uestc
        3
    uestc  
       2019-05-03 23:57:25 +08:00 via Android   ❤️ 1
    把你的回调页面做成一个 bridging page ?可以参考下 oneindex 的实现
    geelaw
        4
    geelaw  
       2019-05-04 00:04:08 +08:00   ❤️ 1
    传递信息的方式是再写一个中转页面来做 AJAX。在服务器上,你有了授权码就可以获取 token,获得 token 之后可以查询用户的 CID。
    Mystery0
        5
    Mystery0  
    OP
       2019-05-04 00:05:35 +08:00
    chinvo
        6
    chinvo  
       2019-05-04 00:11:21 +08:00 via iPhone   ❤️ 1
    方法 1、应用内用某种方法和回调页面共享用户登录状态,比如 cookie/session/token
    方法 2、回调到 localhost / urn:ietf:wg:oauth:2.0:oob,然后 app 再把获取到的授权码通过 api 发给自己的服务器
    Mystery0
        7
    Mystery0  
    OP
       2019-05-04 00:14:23 +08:00
    另一位朋友想到一个方法:将回调授权码的接口写成一个中转的接口,然后在接口中将授权码以自定义 scheme 的形式回调到客户端( APP ),再由客户端将授权码和用户信息一并提交到服务端。
    @uestc
    @geelaw
    两个的解决办法似乎和这个方法是一样的?( oneindex 使用 php 写的,本人 php 仅在入门水平……)( ajax 的话没有去了解过……我猜测和这个思路一个意思?)
    Mystery0
        8
    Mystery0  
    OP
       2019-05-04 00:15:49 +08:00
    @chinvo
    @geelaw
    @xxxy
    @uestc
    感谢各位了,目前看来大家都是一样的解决方法,十分感谢
    huangdayu
        9
    huangdayu  
       2019-05-04 07:36:56 +08:00 via Android
    Oauth 不是使用 code 再请求 token 的吗? Oauth 标准要求客户端如果传了 state 参数,服务端就必须一模一样的回传,难不成微软自己搞一套
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1644 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:50 · PVG 00:50 · LAX 08:50 · JFK 11:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.