2011-10-11 66 views

回答

174
  1. 您不能添加任何重定向URI,重定向URI是常数设置的Oauth的应用程序设置 。 如:http://www.example.com/redirect.html

  2. 要传递一些参数,您的重定向URI,让他们存储在state 参数调用的Oauth网址之前,授权后的URL将相同的参数发送到您的重定向URI作为 state=THE_STATE_PARAMETERS

所以对于你的情况,这样做:

/1。创建参数的JSON字符串 - >

{ "a" : "b" , "c" : 1 }

/2。做一个base64UrlEncode,使它URL安全 - >

stateString = base64UrlEncode('{ "a" : "b" , "c" : 1 }'); 

这是base64UrlEncoding &解码的PHP例子(http://en.wikipedia.org/wiki/Base64#URL_applications):

function base64UrlEncode($inputStr) 
{ 
    return strtr(base64_encode($inputStr), '+/=', '-_,'); 
} 

function base64UrlDecode($inputStr) 
{ 
    return base64_decode(strtr($inputStr, '-_,', '+/=')); 
} 

所以现在的状态会是这样的:stateString - > asawerwerwfgsg ,

在OAuth授权URL传递这种状态:

https://accounts.google.com/o/oauth2/auth? 
    client_id=21302922996.apps.googleusercontent.com& 
    redirect_uri=https://www.example.com/back& 
    scope=https://www.google.com/m8/feeds/& 
    response_type=token& 
    state=asdafwswdwefwsdg, 

对于服务器端的流量将与令牌一起去: http://www.example.com/redirect.html?token=sdfwerwqerqwer&state=asdafwswdwefwsdg

对于客户端的流量它会在散与访问令牌一起: http://www.example.com/redirect.html#access_token=portyefghsdfgdfgsdgd&state=asdafwswdwefwsdg

找回状态,base64UrlDecode它,json_decode它,你有你的数据。

查看更多有关谷歌的OAuth 2浏览:

http://code.google.com/apis/accounts/docs/OAuth2.html

+3

好奇:为什么Base64和不只是做一个urllib.urlencode? –

+0

Base64是用来混淆数据以及URL编码它,如果你需要额外的“安全”一点点通过模糊。 – ricosrealm

+0

@DhruvPathak完美的,我需要发送一个自定义参数与LinkedIn API重定向回来,它是你描述的相同的方法。 – ericsicons

5

如果你英寸NET,你可以保存参数的会话

HttpContext.Current.Session[{varname}] 

,然后重定向到授权页面不带参数

Response.Redirect(your_uri_approved_with_no_querystring_parameters); 
+4

使用诸如天蓝色之类的网站时,这不会缩放。 – spender

+3

@spender:所以你意味着几乎来自同一个客户序列两个请求由webfarm不同的服务器进行处理。如果是这样的话,这不是唯一受到影响的东西,基本上Session变量不能在这种情况下用于任何事情。顺便说一句:我不是争论 - 实际上是想在这里学习。 – rufo

+6

完全有可能,是的......您可以通过管理会话服务器或将会话关闭到数据库来缓解此问题(请参阅http://msdn.microsoft.com/zh-cn/library/ms178586.aspx),或者在您的负载平衡器上启用粘性会话以确保客户端始终返回到同一个Web服务器节点。我提到的所有选项都是设置PITA,所以IMO应该避免在Session中存储任何客户端状态。 – spender

1

您可以重定向有如下的URL参数,

当你从谷歌回应比你可以通过url传递参数,

看下面php代码相同,

if (isset($_GET['code'])) { 
    $client->authenticate(); 
    $_SESSION['token'] = $client->getAccessToken(); 
    $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; 
    header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL) . '?r=page/view'); 

}

在上面的例子中R =页/图是其上我想与参数的响应参数

+0

这是在谷歌提供的PHP代码中发送状态参数的地方。服务器端有三个请求。这意味着最终的请求根本没有任何查询字符串变量。 – lol