Google api 将使用Google OAuth2.0的登录电子邮件限制为特定域名

Google api 将使用Google OAuth2.0的登录电子邮件限制为特定域名,google-api,oauth-2.0,google-oauth,Google Api,Oauth 2.0,Google Oauth,我似乎找不到任何文档说明如何限制我的web应用程序(使用OAuth2.0和Google API)的登录,使其仅接受用户通过特定域名或一组域名上的电子邮件发出的身份验证请求。我想要白名单而不是黑名单 有没有人对如何做到这一点提出建议,有没有关于官方认可的方法的文档,或者有没有一个简单、安全的解决方法 作为记录,我不知道任何关于用户的信息,直到他们试图通过谷歌的OAuth认证登录。我收到的只是基本的用户信息和电子邮件。所以我有一个答案给你。在oauth请求中,您可以添加“hd=domain.com”

我似乎找不到任何文档说明如何限制我的web应用程序(使用OAuth2.0和Google API)的登录,使其仅接受用户通过特定域名或一组域名上的电子邮件发出的身份验证请求。我想要白名单而不是黑名单

有没有人对如何做到这一点提出建议,有没有关于官方认可的方法的文档,或者有没有一个简单、安全的解决方法


作为记录,我不知道任何关于用户的信息,直到他们试图通过谷歌的OAuth认证登录。我收到的只是基本的用户信息和电子邮件。

所以我有一个答案给你。在oauth请求中,您可以添加“hd=domain.com”,它将限制来自该域的用户的身份验证(我不知道您是否可以执行多个域)。你可以找到hd参数文件

我在这里使用google api库:因此我必须手动编辑/auth/apiouth2.php文件,如下所示:

public function createAuthUrl($scope) {
    $params = array(
        'response_type=code',
        'redirect_uri=' . urlencode($this->redirectUri),
        'client_id=' . urlencode($this->clientId),
        'scope=' . urlencode($scope),
        'access_type=' . urlencode($this->accessType),
        'approval_prompt=' . urlencode($this->approvalPrompt),
        'hd=domain.com'
    );

    if (isset($this->state)) {
        $params[] = 'state=' . urlencode($this->state);
    }
    $params = implode('&', $params);
    return self::OAUTH2_AUTH_URL . "?$params";
}
编辑:
我还在开发这个应用程序,发现了这个,这可能是这个问题更正确的答案

定义提供程序时,在末尾传入一个带有“hd”参数的哈希值。你可以在这里读到

例如,对于config/initializer/designe.rb

config.omniauth :google_oauth2, 'identifier', 'key', {hd: 'yourdomain.com'}

下面是我在node.js中使用passport所做的工作<代码>配置文件是试图登录的用户

//passed, stringified email login
var emailString = String(profile.emails[0].value);
//the domain you want to whitelist
var yourDomain = '@google.com';
//check the x amount of characters including and after @ symbol of passed user login.
//This means '@google.com' must be the final set of characters in the attempted login 
var domain = emailString.substr(emailString.length - yourDomain.length);

//I send the user back to the login screen if domain does not match 
if (domain != yourDomain)
   return done(err);
然后创建逻辑来查找多个域,而不是一个域。我相信这种方法是安全的,因为1。“@”符号在电子邮件地址的第一部分或第二部分中不是有效字符。我无法通过创建像
mike@fake@google.com
2。在传统的登录系统中我可以,但这个电子邮件地址在谷歌中永远不可能存在。如果它不是有效的Google帐户,则无法登录。

客户端: 使用
auth2
init函数,您可以传递
hosted_domain
参数,将登录弹出窗口中列出的帐户限制为与您的
hosted_domain
匹配的帐户。您可以在以下文档中看到:

服务器端: 即使使用受限的客户端列表,您也需要验证
id\u令牌
是否与您指定的托管域匹配。对于某些实现,这意味着在验证令牌后检查从google收到的
hd
属性

完整堆栈示例: 网络代码:
gapi.load('auth2',函数(){
//使用托管的\u域初始化auth2
//只有匹配的帐户才会显示在列表中或被接受
var auth2=gapi.auth2.init({
client_id:“your-client-id.apps.googleusercontent.com”,
托管域:'your special domain.com'
});
//设置您的登录按钮
auth2.attachClickHandler(yourButtonElement,{});
//当当前用户更改时
auth2.currentUser.listen(函数(用户){
//如果用户已登录
if(user&&user.isSignedIn()){
//验证服务器上的令牌,
//您的服务器需要再次检查
//'hd'与指定的'hosted_domain'匹配;
ValidateTokenonyYourServer(user.getAuthResponse().id\u令牌)
.然后(函数(){
console.log('yay');
})
.catch(函数(err){
然后(函数(){auth2.signOut();});
});
}
});
});
服务器代码(使用Google Node.js库): 如果您没有使用Node.js,可以在此处查看其他示例:

const-GoogleAuth=require('google-auth-library');
const Auth=new GoogleAuth();
const authData=JSON.parse(fs.readFileSync(您的_auth_creds_JSON_文件));
const oauth=new Auth.OAuth2(authData.web.client\u id,authData.web.client\u secret);
const acceptableISSs=新集合(
['accounts.google.com','https://accounts.google.com']
);
const validateToken=(令牌)=>{
返回新承诺((解决、拒绝)=>{
如果(!令牌){
拒绝();
}
oauth.verifyIdToken(token,null,(err,ticket)=>{
如果(错误){
退货拒绝(err);
}
const payload=ticket.getPayload();
const tokenIsOK=有效负载&&
payload.aud===authData.web.client\u id&&
新日期(payload.exp*1000)>新日期()&&
可接受ISSS.has(有效载荷iss)&&
payload.hd===“your special domain.com”;
返回tokenIsOK?resolve():拒绝();
});
});
};

自2015年以来,有一种方法可以设置该库,而无需像aaron bruce那样编辑库的源代码

在生成url之前,只需对您的Google客户端调用
setHostedDomain

$client->setHostedDomain("HOSTED DOMAIN")

我也在研究这个。我有一个应用程序,我希望只有在我们的google apps for business domain上拥有帐户的人才能访问。google OpenID的实现可能更适合我们两人…我如何使用google sdk和c#实现域用户登录?请有人看看这个问题,我对这个问题有一个oben赏金,所以有人能帮我吗?meI不知道这个参数,你能链接到你发现它的地方吗?不幸的是,我必须从我的一位同事那里得到信息,我在谷歌的文档中没有找到这个。我的同事认为他在OpenID规范中找到了引用,并在OpenAuth规范中尝试了它,它似乎起了作用。请谨慎使用,因为它似乎是未记录的功能。重要提示:即使您在
createAuthUrl
函数中指定了
hd
参数,您仍需要验证用户是否使用您的域电子邮件地址登录。更改link参数以允许所有电子邮件地址并随后访问您的应用程序非常容易