Changeset 17507
- Timestamp:
- 08/12/08 15:51:43 (5 years ago)
- Location:
- lang/perl/OAuth-Lite/trunk/lib/OAuth/Lite
- Files:
-
- 2 modified
-
Consumer.pm (modified) (1 diff)
-
Server/mod_perl2.pm (modified) (15 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/perl/OAuth-Lite/trunk/lib/OAuth/Lite/Consumer.pm
r8716 r17507 399 399 my ($self, %args) = @_; 400 400 $args{url} ||= $self->request_token_url; 401 my $request_token_url = $args{url}401 my $request_token_url = delete $args{url} 402 402 or Carp::croak qq/get_request_token needs url in hash params 403 403 or set request_token_path on constructor./; 404 my $realm = $args{realm} || $self->{realm} || '';404 my $realm = delete $args{realm} || $self->{realm} || ''; 405 405 my $res = $self->__request( 406 realm => $realm, 407 url => $request_token_url, 406 realm => $realm, 407 url => $request_token_url, 408 params => {%args}, 408 409 ); 409 410 unless ($res->is_success) { -
lang/perl/OAuth-Lite/trunk/lib/OAuth/Lite/Server/mod_perl2.pm
r4677 r17507 146 146 147 147 sub service { 148 my ($self, $params) = @_;148 my $self = shift; 149 149 } 150 150 … … 250 250 And disables the exchanged request-token. 251 251 252 =head2 service ($params)252 =head2 service 253 253 254 254 Handle protected resource. … … 256 256 257 257 sub service { 258 my ($self, $params) = @_; 258 my $self = shift; 259 my $params = $self->{params}; 259 260 my $token_string = $params->{oauth_token}; 260 261 my $access_token = MyDB::Scheme->resultset('RequestToken')->find($token_string); … … 312 313 $self->oauth->allow_extra_param('foo'); 313 314 315 =head2 request_method 316 317 Request method (Upper Case). 318 When the raw request method is POST and X-HTTP-Method-Override is define in header, 319 return the value of X-HTTP-Method-Override. 320 321 =head2 request_uri 322 323 Returns request uri 324 314 325 =head2 request_body 315 326 … … 319 330 320 331 Set proper 'WWW-Authentication' response header 332 333 =head2 is_required_request_token 334 335 Check if current request requires request-token. 336 337 =head2 is_required_access_token 338 339 Check if current request requires access-token. 340 341 =head2 is_required_protected_resource 342 343 Check if current request requires protected-resource. 344 345 =head2 accepts_consumer_request 346 347 You can adopt OAuth Consumer Request 1.0. 348 349 See http://oauth.googlecode.com/svn/spec/ext/consumer_request/1.0/drafts/1/spec.html 350 351 To adopt this spec, you have to set var 'AcceptConsumerRequest' on httpd.conf 352 353 <Location /resource> 354 PerlSetVar Mode PROTECTED_RESOURCE 355 PerlSetVar AcceptConsumerRequest 1 356 PerlResponseHandler MyServiceWithOAuth 357 </Location> 358 359 Then override service method for protected resource. 360 361 sub service { 362 my $self = shift; 363 my $params = $self->{params}; 364 365 my $resource_owner_id; 366 367 if (exists $params->{oauth_token}) { 368 369 my $access_token_value = $params->{oauth_token}; 370 $resource_owner_id = $self->get_user_id_of_access_token($access_token_value); 371 372 } else { 373 374 my $consumer_key = $params->{oauth_consumer_key}; 375 $resource_owner_id = $self->get_user_id_of_consumer_developer($consumer_key); 376 377 } 378 379 my @resources = MyDB::Scheme->resultset('SomeResource')->search({ 380 user_id => $resource_owner_id, 381 }); 382 383 # output resource data in the manner your api defines. 384 ... 385 386 return Apache2::Const::OK; 387 388 } 321 389 322 390 =head2 error … … 378 446 my $self = bless { 379 447 request => $r, 380 oauth => OAuth::Lite::ServerUtil->new, 381 realm => undef, 382 secure => 0, 383 mode => PROTECTED_RESOURCE, 448 oauth => OAuth::Lite::ServerUtil->new, 449 realm => undef, 450 secure => 0, 451 mode => PROTECTED_RESOURCE, 452 accepts_consumer_request => 0, 453 params => {}, 454 completed_validation => 0, 384 455 }, $class; 385 456 my $realm = $self->request->dir_config('Realm'); 386 457 $self->{realm} = $realm if $realm; 458 my $accept = $self->request->dir_config('AcceptConsumerRequest'); 459 $self->{accepts_consumer_request} = $accept if $accept; 387 460 my $mode = $self->request->dir_config('Mode'); 461 my @valid_modes = (PROTECTED_RESOURCE, REQUEST_TOKEN, ACCESS_TOKEN); 388 462 if ($mode) { 389 if (none { $mode eq $_ } (PROTECTED_RESOURCE, REQUEST_TOKEN, ACCESS_TOKEN)) {463 if (none { $mode eq $_ } @valid_modes) { 390 464 die "Invalid mode."; 391 465 } else { … … 420 494 } 421 495 496 sub request_uri { 497 my $self = shift; 498 return $self->request->uri; 499 } 500 501 sub request_method { 502 my $self = shift; 503 unless (defined $self->{_request_method}) { 504 my $method = uc($self->request->method); 505 my $x_method = uc($self->request->headers_in->{'X-HTTP-Method-Override'} || ''); 506 if ($method eq 'POST' && ($x_method eq 'PUT' || $x_method eq 'DELETE')) { 507 $self->{_request_method} = $x_method; 508 } else { 509 $self->{_request_method} = $method; 510 } 511 } 512 return $self->{_request_method}; 513 } 514 422 515 sub __service { 423 516 my $self = shift; … … 427 520 if ($authorization && $authorization =~ /^\s*OAuth/) { 428 521 ($realm, $params) = parse_auth_header($authorization); 429 } elsif ( uc($self->request->method) eq 'POST'522 } elsif ( $self->request_method() eq 'POST' 430 523 && $self->request->headers_in->{'Content-Type'} =~ m!application/x-www-form-urlencoded!) { 431 524 for my $pair (split /&/, $self->request_body) { … … 439 532 } 440 533 441 my $needs_to_check_token = $self->__is_required_request_token 442 ? 0 443 : 1; 534 my $needs_to_check_token = ( $self->is_required_request_token 535 || ( $self->is_required_protected_resource && $self->accepts_consumer_request ) ) 536 ? 0 537 : 1; 444 538 445 539 unless ($self->oauth->validate_params($params, $needs_to_check_token)) { 446 540 return $self->errout(400, $self->oauth->errstr); 447 541 } 542 543 $self->{params} = $params; 448 544 449 545 my $consumer_key = $params->{oauth_consumer_key}; … … 467 563 my $request_uri = $uri->as_string; 468 564 469 if ($self-> __is_required_request_token) {565 if ($self->is_required_request_token) { 470 566 471 567 $self->oauth->verify_signature( 472 method => $self->request ->method,568 method => $self->request_method(), 473 569 params => $params, 474 570 url => $request_uri, … … 476 572 ) or return $self->errout(401, q{Invalid signature}); 477 573 478 my $request_token = $self->publish_request_token($consumer_key); 574 my $request_token = $self->publish_request_token($consumer_key) 575 or return $self->errout(401, $self->errstr); 479 576 return $self->__output_token($request_token); 480 577 481 } elsif ($self-> __is_required_access_token) {578 } elsif ($self->is_required_access_token) { 482 579 483 580 my $token_value = $params->{oauth_token}; … … 487 584 } 488 585 $self->oauth->verify_signature( 489 method => $self->request ->method,586 method => $self->request_method(), 490 587 params => $params, 491 588 url => $request_uri, … … 499 596 } else { 500 597 501 my $token_value = $params->{oauth_token}; 502 my $token_secret = $self->get_access_token_secret($token_value); 503 unless (defined $token_secret) { 504 return $self->errout(401, q{Invalid token}); 598 my $token_secret = ''; 599 if (exists $params->{oauth_token}) { 600 my $token_value = $params->{oauth_token}; 601 $token_secret = $self->get_access_token_secret($token_value); 602 unless (defined $token_secret) { 603 return $self->errout(401, q{Invalid token}); 604 } 505 605 } 506 606 507 607 $self->oauth->verify_signature( 508 method => $self->request ->method,608 method => $self->request_method(), 509 609 params => $params, 510 610 url => $request_uri, 511 611 consumer_secret => $consumer_secret || '', 512 token_secret => $token_secret || '',612 token_secret => $token_secret, 513 613 ) or return $self->errout(401, q{Invalid signature}); 614 615 $self->{completed_validation} = 1; 514 616 515 617 return $self->service($params); … … 528 630 } 529 631 530 sub __is_required_request_token { 632 sub is_consumer_request { 633 my $self = shift; 634 unless ($self->is_required_protected_resource && $self->accepts_consumer_request) { 635 die qq(This method can be called only when accessing protected resource. 636 and accepts consumer-request.); 637 } 638 unless ($self->{completed_validation}) { 639 die qq(This method can be called only after validation); 640 } 641 return exists $self->{params}{oauth_token} ? 1 : 0; 642 } 643 644 sub is_required_request_token { 531 645 my $self = shift; 532 646 return ($self->{mode} eq REQUEST_TOKEN) ? 1 : 0; 533 647 } 534 648 535 sub __is_required_access_token {649 sub is_required_access_token { 536 650 my $self = shift; 537 651 return ($self->{mode} eq ACCESS_TOKEN) ? 1 : 0; 652 } 653 654 sub is_required_protected_resource { 655 my $self = shift; 656 return ($self->{mode} eq PROTECTED_RESOURCE) ? 1 : 0; 657 } 658 659 sub accepts_consumer_request { 660 my $self = shift; 661 return $self->{accepts_consumer_request}; 538 662 } 539 663 … … 585 709 sub set_authenticate_header { 586 710 my $self = shift; 587 $self->request->err_headers_out->add( 'WWW-Authenticate',588 sprintf(q{OAuth realm="%s"}, $self->realm));711 my $header = sprintf(q{OAuth realm="%s"}, $self->realm); 712 $self->request->err_headers_out->add( 'WWW-Authenticate', $header ); 589 713 } 590 714
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)