谷歌OAuth2获取id_token

3

我是一名从事客户端AngularJS开发的工程师。我正在尝试实现Google OAuth2。我已经获得了访问令牌,但我需要获取id_token。

我添加了app.js、controller.js和html部分。

我按照这个教程进行操作:http://anandsekar.github.io/oauth2-with-angularjs/

app.js:

 angular
  .module('angularoauthexampleApp', [ ])
  .config(function ($routeProvider) {
    $routeProvider
      .when('/', {
        templateUrl: 'views/main.html',
        controller: 'MainCtrl'
      })
      .when('/access_token=:accessToken', {
        template: '',
        controller: function ($location,$rootScope) {
          var hash = $location.path().substr(1);

          var splitted = hash.split('&');
          var params = {};

          for (var i = 0; i < splitted.length; i++) {
            var param  = splitted[i].split('=');
            var key    = param[0];
            var value  = param[1];
            params[key] = value;
            $rootScope.accesstoken=params;
          }
          $location.path("/about");
        }
      })
      .otherwise({
        redirectTo: '/'
      });
  });

controller.js

angular.module('angularoauthexampleApp')
  .controller('MainCtrl', function ($scope) {

    $scope.login=function() {
        var client_id="your client_id";
        var scope="email";
        var redirect_uri="http://localhost:9000";
        var response_type="token";
        var url="https://accounts.google.com/o/oauth2/auth?scope="+scope+"&client_id="+client_id+"&redirect_uri="+redirect_uri+
        "&response_type="+response_type;
        window.location.replace(url);
    };
  });

html:

<button class="btn btn-primary" ng-click="login()">Login</button>
3个回答

4

您需要使用nonce。添加它后,id_token将在响应中返回。

例如:

let params = {
    'client_id': GOOGLE_API_CLIEND_ID,
    'redirect_uri': `${location.origin}/auth/google`,
    'response_type': 'id_token token',
    'scope': GOOGLE_API_SCOPES,
    'state': 'af0ifjsldkj',
    'nonce': 'n-0S6_WzA2Mj'
};

对于隐式流,必须使用nonce参数。如需更多信息,请参阅http://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthRequest


还有一件事 - 如果没有nonce,响应类型中的id_token将无法工作,这似乎是谷歌安全方面的副作用,而不是按照规范来的。 - Timofey Lavrenyuk

2

要接收一个id_token,您需要将response_type参数更改为:

var response_type="id_token";

作为响应,您将获得一个id_token。如果您需要同时获取id_tokenaccess_token,则应将“token”添加到response_type中:

var response_type="token id_token";

想要了解更多,请阅读OpenId文章

你也可以使用Google Ouath Playground测试身份验证流程。


0
要触发OpenID Connect流程(这是OAuth 2.0的扩展),您需要在身份验证请求中添加“openid”范围(并对之间的空格进行urlencode),所以:
var scope="openid%20email";

我尝试了但是得到的结果是:"ya29.CjQLA2yjm5drVlAPKU_aKCEFeeMM_Ikezqw7rOe9y2PzUDUdsJSt5A5m1D_sjpOCcryMSmuj" authuser:"2", expires_in:"3600" hd:"xxx.com" prompt:"none" session_state:"bb554bedabf47c6f54aa07d0c69ba383b9ef23a6..1c93" token_type:"Bearer" - RSKMR
我没有收到id_token。 - RSKMR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接